// 官方定义 type Exclude<T, U> = T extends U ? never : T;
1 2 3 4 5 6 7 8 9
// A 类型为10 type A = Exclude<"a" | 10, "a" | "b" | "c">;
// 你以为的 Exclude type A = "a" | 10 extends "a" | "b" | "c" ? never : "a" | 10; // 实际上的 Exclude type A = | ("a" extends "a" | "b" | "c" ? never : "a") | (10 extends "a" | "b" | "c" ? never : 10);
Extract
Extract<T, U>的意思是从 T 中提取可分配给 U 的类型
1 2
// 官方定义 type Extract<T, U> = T extends U ? T : never;
和 Exclude 相反
1 2 3 4
// number type A = Exclude<number | string, string>; // string type B = Extract<number | string, string>;
Omit
Omit<T, U>的意思是从对象类型 T 中剔除 U 属性并创建一个新的属性
1 2
// 官方定义 type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;
1 2 3 4 5 6
type User = { id: number; name: string; email: string; }; type UserWithoutEmail = Omit<User, "email">;
等价于:
1 2 3 4
type UserWithoutEmail = { id: number; name: string; }
ReturnType
ReturnType<T>返回了范型参数 T 的返回值类型
1 2
// 官方定义 type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;
1 2
// A: string type A = ReturnType<() => string>;
InstanceType
获取构造函数的实例类型
1 2
// 官方定义 type InstanceType<T extends new (...args: any) => any> = T extends new (...args: any) => infer R ? R : any;