TS中预设的类型演算

196 阅读3分钟

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类型中的所有成员都变为可选状态

image.png

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属性。

image.png

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的类型演算后,保留了"北京" | "上海"

值得注意的是ExcludeExtract的第二个泛型如果在第一个泛型中不存在,则不存在的那部分不会保留

image.png

image.png

NoNullable

NoNullable<T>是用来将T类型中的 undefined 和 null 都去除掉。请看以下示例和效果:

image.png

ReturnType

ReturnType<T>传入的泛型是一个函数的类型,它会帮助演算出该函数类型的返回值的类型。请看以下示例和效果:

image.png

image.png

image.png

InstanceType

InstanceType<T>传入的泛型是一个构造函数的类型,它会帮助演算出该类型的构造函数返回的对象的类型。请看以下示例和效果:

image.png