【TS】一些常用的工具类型
Partial
为所有属性添加?这个midfier,也就是设置所有属性都是可选属性。
interface Person{
name: string;
age: number;
}
type NewPerson = Partial<Person>;
const p: NewPerson = {
name: 'ashen';
};
// name和age都被设置成了可选属性
Required
设置所有属性都是必填的。
interface Person{
name: string;
age?: number;
}
type NewPerson = Required<Person>;
const p: NewPerson = {
name: 'ashen'; // error age被设置成了必填属性
};
Record
设置给定的可能属性,都对应给定类型的“key:value”形式
type r = Record<'a'|'b'|'c', Person>;
// 最终实现 {a: Person; b: Person; c: Person}
Pick
将某个类型中的子属性挑选出来
type NewPerson = Pick<Person, 'name'>;
// NewPerson变成:{name: string}
Exclude
将某个类型中的子属性剔除
interface Animal{
name: string;
age: number;
sex: string;
sayHi: () => string;
eat: string => void;
}
type Dog = Exclude<keyof Animal, 'sayHi'> // Dog类中包含除开sayHi的所有属性
当我们需要对interface进行继承时,如果像以下方式处理,会报错
interface Chicken {
name: string;
age: number;
egg: number;
}
interface NewChicken extends Chicken {
name: number;
}
此时我们需要将不被overwrite的属性提取出来,再进行继承
interface NewChicken extends pick<Chicken, 'age'|'egg'>{
name: number;
}
但是如果需要提取的属性很多,难道要一个个列举出来吗?此时可以通过Exclude将name属性剔除,再传入Pick进行选择
interface NewChicken extends pick<Chicken, Exclude<keyof Chicken, 'name'>>{
name: number;
}
Omit
就是以上Pick和Exclude的结合
Parameters
得到函数参数类型组成的元祖类型
type A = Parameters<typeof Array.isArray> // [any]
type B = Parameters<typeof parseInt> // [number, (string | undefined)?]
ReturnType
得到函数返回值的类型
function testFunc(){
return 123;
}
type A = ReturnType<typeof testFunc>; // number