联合类型 |
当 TS 不确定一个联合类型的变量到底是哪个类型的时候,可以定义多种类型,例如,一个变量既支持 number 类型,又支持 string 类型.
let num: 类型1 | 类型2 | 类型3 .... = 初始值
let num:number | string = 1 // 可以写多个类型 // 1|'2' 在这里的1 和 '2‘是类型, 常量,表示numAndStr2的值只能是 1 或 '2'
let numAndStr2: 1|'2' = 1
let numAndStr3: 1|'2' = '2'// 表明obj必须要有a 或 b属性,并且a的类型为1,或b的类型为'3'(可以a、b都有)
let obj:{a:1}|{b:'3'} = {a: 1};
交叉类型 &
对已有的类型进行扩展
// 交叉类型
let obj:{name: string, age:number} & {height: number};
obj = {name: 'll', age: 19, height: 20} // 属性必须全部要有,少了一个都报错// 如果一个属性出现多次类型的设置,必须都要满足才行
let obj1:{name: string, age:number} & {height: number, age: 18};
// obj1 = {name: 'xiaotian', age: 19, height: 20} // 报错, age不满足18
obj1 = {name: 'll', age: 18, height: 20}
联合类型 | 是指可以取几种类型中的任意一种,而交叉类型 & 是指把几种类型合并起来。
TS泛型
type Person = {name: string;age: number;id: number;
}// Pick 挑选出指定属性,生成新对象类型
type UserInfo = Pick<Person, 'name' | 'age'>; // 挑选出 { name: string; age: number }// Omit 排除指定的属性,生成新的对象类型
type UserInfo2 = Omit<Person, 'id'>; // 排除 id,生成 { name: string; age: number }// Partial 将对象所有属性变为可选
type PartialPerson = Partial<Person>; // { name?: string; age?: number; id?: number }// Readonly 将对象所有属性变为只读
type ReadonlyPerson = Readonly<Person>; // { readonly name: string; readonly age: number; readonly id: number }// Record 生成对象类型,例如
type PersonMap = Record<number, Person>; // { [index: number]: Person }// Exclude 排除一些联合类型
type UserInfoKeys = Exclude<keyof Person, 'id'>; // 'name' | 'age'
属性修饰
对象的属性是可以有修饰符的,目前有两种修饰符,分别是 readonly 关键字对应的可选属性 和 ?: 对应的可选属性.
type Person = {name: string;age?: number; // 1、可选属性readonly id: number; // 2、只读属性
}const person: Person = {name: '张三',id: 1,// 没有 age 属性,不报错,说明 age 可选
}person.id = 2; // 报错,不能修改只读属性
person.age = 18; // 正常
类型的父子关系
类型是有父子关系的,子类型的值可以赋值给父类型,但是父类型的值是不能够赋值给子类型的.
type ParentType = 1 | 2 | string
type SubType = 1
//SubType 是 ParentType 的 父级let parentData: ParentType = 2;
let subData: SubType = 1;subData = parentData; // ❌ 父类型不能赋值给子类型的值
parentData = subData; // 🆗
对象类型的遍历
把所有的属性都加上 readonly 修饰符
// ts 类型对象遍历
type Person = {name: string;age?: number;readonly id: number;
}type Readonly<T> = {readonly [Key in keyof T]: T[Key];
}
keyof 关键字可以获取到对象所有的属性(前面讲过)
Key 就是每次遍历时存的属性名
T[Key] 就是每次遍历时存的属性值
然后我们在每个属性前面加上了 readonly 这样所有的属性都是只读的了