Partial
Partial<T>是用来将T类型中的所有成员变为可选。
interface User {
loginId: string;
loginPwd: string;
}
const myUser: Partial<User> = {
loginId: "123",
loginPwd: "234",
};
// Partial<User>产生的效果等同于以下写法,只不过它更加通用。
interface PartialUser {
loginId?: string;
loginPwd?: string;
}
使用Partail并将User接口类型作为泛型传入之后,就等同于将User类型中的所有成员都变为可选状态
Required
Required<T>是用来将T类型中的所有成员变为必填。
interface User {
loginId: string;
loginPwd: string;
age?: number;
}
const myUser: Required<User> = {
loginId: "123",
loginPwd: "234",
age: 333, // age属性变为了必填
};
使用Required并将User接口类型作为泛型传入之后,就等同于将User类型中的所有成员都变为必填状态,所以这里声明的myUser对象中必须拥有age属性。
Readonly
Required<T>是用来将T类型中的所有成员变为只读。
interface User {
loginId: string;
loginPwd: string;
age?: number;
}
const MyUser: Readonly<Required<User>> = {
loginId: "123",
loginPwd: "234",
age: 123,
};
MyUser.loginId = '456' // ts报错:无法为“loginId”赋值,因为它是只读属性。
使用Required并将之前的Required<User>作为泛型传入之后,就等同于将User中的所有成员都转为必填,并且该属性不可被重写。
Exclude
Exclude<T,U>是用来从T中剔除可以赋值给U的类型,什么意思呢?请看以下示例:
interface citys {
name: "北京" | "上海" | "深圳" | "广州";
}
type ExcludeCitys = "北京" | "上海";
const NEWCITY1: Exclude<citys["name"], ExcludeCitys> = "广州";
const NEWCITY2: Exclude<citys["name"], ExcludeCitys> = "深圳";
// TS报错:不能将类型“"上海"”分配给类型“"深圳" | "广州"”。
const NEWCITY3: Exclude<citys["name"], ExcludeCitys> = "上海";
// TS报错:不能将类型“"北京"”分配给类型“"深圳" | "广州"”。
const NEWCITY4: Exclude<citys["name"], ExcludeCitys> = "北京";
从以上代码产生的效果不难看出,联合类型"北京" | "上海" | "深圳" | "广州"经过Exclude的类型演算后,剔除了"北京" | "上海"。
Extract
Extract<T,U>是用来从T中保留可以赋值给U的类型。
interface citys {
name: "北京" | "上海" | "深圳" | "广州";
}
type ExtractCitys = "北京" | "上海";
// TS报错:不能将类型“"广州"”分配给类型“"北京" | "上海"”。
const NEWCITY1: Extract<citys["name"], ExtractCitys> = "广州";
// TS报错:不能将类型“"深圳"”分配给类型“"北京" | "上海"”。
const NEWCITY2: Extract<citys["name"], ExtractCitys> = "深圳";
const NEWCITY3: Extract<citys["name"], ExtractCitys> = "上海";
const NEWCITY4: Extract<citys["name"], ExtractCitys> = "北京";
从以上代码产生的效果不难看出,联合类型"北京" | "上海" | "深圳" | "广州"经过Extract的类型演算后,保留了了"北京" | "上海"。
值得注意的是,Exclude和Extract的第二个泛型如果在第一个泛型中不存在,则不存在的那部分不会保留!
NoNullable
NoNullable<T>是用来将T类型中的 undefined 和 null 都去除掉。请看以下示例和效果:
ReturnType
ReturnType<T>传入的泛型是一个函数的类型,它会帮助演算出该函数类型的返回值的类型。请看以下示例和效果:
InstanceType
InstanceType<T>传入的泛型是一个构造函数的类型,它会帮助演算出该类型的构造函数返回的对象的类型。请看以下示例和效果: