鸿蒙开发加强1

接口继承
interface IChinese extends Iperson { }

简单类型和复杂类型
number string boolean undifined  null
function object Array

typeof null   ==> 'object'

简单类型:容器中只放纯粹的一个数据
复杂类型:容器中放的是一堆数据,一堆代码


内存中的堆栈空间
桟:优势速度快  简单数据——》基本数据类型
堆:优势量大    复杂类型——》引用数据类型


桟空间: 存放堆的数据的地址 
堆空间:存放 变量的 值
桟空间:存放 变量的内存地址(堆中的地址)


引用数据类型存放到堆里面
基本数据类型存放到栈里面

引用数据类型中存的是地址
两个变量同时指向同一块内容(一份数据),操作时会受影响
基本数据类型变量中存储的是数据,各自有独立的空间,后续操作,互不影响


内存空间(桟空间,堆空间)

技巧:
参数的传递也是一种赋值 cv数据 还是cv地址
遇到函数一律不看 看到函数调用才看函数

接口实现
配合class一起用
利用接口限制(保证)class不出错
关键字: implements

// 前面的类 要满足后面的接口
class Person implements IPerson {}


泛型
函数除了给参数添加类型外 还需要给返回值添加类型(很多时候可以省略)

let xx = (num:number):number =>{
  return num
}

泛型是一个类型变量
你什么类型,我返回什么类型

function funPro<T> (num:T):T  {  }
let xx:T = funPro<number>(5)
let xx:T = funPro<string>('abc')

function fun<T>(num:T):T {
  return num
}
let xx:number = fun<number>(123)
console.log('xx , ',xx )

定义函数时在圆括号的前面加<泛型>
如果用到泛型,需要给普通函数

大写字母开头,调用时可以省略泛型

函数的参数类型不确定的时候,给泛型
函数的返回值类型确定的时候,给出具体的类型
函数的参数类型和返回值的类型不确定的时候,给出泛型

泛型函数
泛型接口
泛型类


泛型约束 => 限制泛型
1. 定义用来约束的 接口(interface)
2. 类型参数通过extends即可实现

除了数组外,字符串也有长度


let num:number = 99 // 约束的是变量
泛型约束 约束的是类型


多个泛型参数
function fun<T1,T2>(p1:T1,p2:T2) {
  console.log('',p1,p2)
}
fun<number,boolean>(1,true)
传入大于1个的位置类型的参数,写多个泛型,用逗号隔开

泛型接口
接口名的后面<T>
使用时的时候接口名<T>

interface IP<T> {
  name:T
  age:number
  
  getName: ()=> T  // 返回的类型不确定
}
let xx:IP<string> = {
  name:'张三',
  age:18,
  
  getName:()=>{
    return '张三'
  }
}

let xx2:IP<number> = {
  name:1,
  age:18,
  
  getName:()=>{
    return 1
  }
}

泛型类
只要类型不明确的地方=>就是泛型
泛型类的时候用constructor提供初始数据

class Person<T> {
  name:T

  constructor(name:T) {
    this.name = name
  }
}

let p1:Person<string> = new Person<string>('张三')
let p2:Person<number> = new Person<number>(2)

工具类型  -》基于已有类型得到新类型
Partial
Required
Readonly
Record


Partial 将所有的属性设置为可选
type 新类型 = Partial<接口>
type 新类型 = Partial<类>

Required  将所有的属性设置为必选
type 新类型 = Required<接口>
type 新类型 = Required<类>

Readonly  将所有的属性设置为只读
type 新类型 = Readonly<接口>
type 新类型 = Readonly<类>

只读在于读,有改的动作就报错


Record 一般只用于源码
type xx = Record<类型1(联合类型),类型2>

class CarInfo {
  brand:string
  color: Color

  constructor(brand: string, color: Color) {
    this.brand = brand
    this.color = color
  }
}

type ff = '小米'|'苹果'

type RE = Record<ff,CarInfo>


// 通过constructor提供初始值的话 必须new 
let lh:RE = {
  '小米':new CarInfo('小米', Color.Green),
  '苹果':new CarInfo('苹果', Color.Green)
}

通过constructor提供初始值的话 必须new 


空安全
null 空
undefined  未定义

可能为空的数据 需要进行特殊处理
通过联合类型指定为空,使用时需要判断是否为空
if( num != null ) {  }


可选链 ?.

空值合并运算符
语法: a??b   

非空断言运算符 --> 变量!

let num:number|null = null
num! + 1
非空断言运算符不能滥用,必须有百分百把握不为空

桟的理解


 

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值