接口继承
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
非空断言运算符不能滥用,必须有百分百把握不为空
桟的理解