1. 联合类型 |, 交叉类型
let a: string | number = "123"; // 变量a的类型既可以是string,也可以是number
a = 123;
// 交叉类型
interface Student {
classNo: string;
}
interface Person {
name: string;
}
const a: Student&Person = {
classNo: "123",
name: "fe"
}
2. keyof
interface Person {
name: string;
age: number;
}
type PersonKeys = keyof Person; // 等同于 type PersonKeys = 'name' | 'age'
const p1: PersonKeys = "name"; // 可以
const p2: PersonKeys = "age"; // 可以
// const p3: PersonKeys = 'height' // 不能将类型“"height"”分配给“name | age”
3. Record用于属性映射
type PersonMap = Record<string, Person>;
const me: PersonMap = {
confidence: {
name: "FE",
age: 18,
},
};
// Record的的实现
type MyRecord<K extends string|number|symbol, T> = {
[P in K]: T
}
4. Partial (部分的; 不完全的)
type PartialPerson = Partial<Person>;
const partialPersonInstance: PartialPerson = {
name: '12',
// 或者只有age属性, 或者两个属性都不存在
};
// partial的内部定义
type MyPartial<T> = {
[K in keyof T]?: T[K]
}
5. Required(必须的) 将一个定义中的属性全部变成必选参数
type RequiredPerson= Required<Person>;
const requiredPersonInstance: RequiredPerson = {
name: "12",
age: 20,
};
6. ts中可以选择一个原来的接口中一部分的属性定义
type PickPerson = Pick<Person, 'name'>;
const pickPersonInstance: PickPerson = {
name: 'FE',
// age: 20, // 不能有age属性, 会报错
};
type MyPick<T, K extends keyof T> = {
[P in K]: T[P];
};
7. readonly 让一个定义中的所有属性都变成只读参数
type ReadOnlyPerson = Readonly<Person>;
const readPersonInstance: ReadOnlyPerson = {
name: '123',
age: 20,
};
// readPersonInstance.name = '234'; // error
8. exclude 排除"联合类型" 中一部分的内容
type ExcludePerson = Exclude<PersonKeys, "name">;
const excludePersonKeys: ExcludePerson = "age"; // 只能为age
// T extends U 就判断是否’name’ | ‘age’, 有 name, 有name就返回never,就代表将其排除
type MyExclude<T, U> = T extends U ? never : T;
9. Omit 省略: 将接口或者类型的键值对删除一部分
type SomeOfPerson = Omit<Person, 'name'>;
const omitPersonInstance: SomeOfPerson = {
age: 20,
// name: 1, // 不能有name属性 会报错
};
type MyOmit<T, K extends string|number|symbol> = {
[P in Exclude<keyof T, K>]: T[P]
}
网友评论