在 TypeScript 中提供了许多自带的工具类型,因为这些类型都是全局可用的,所以无须导入即可直接使用。
操作接口类型
Partial
Partial 可以将一个类型的所有属性变成可选的,并且改工具类型返回的类型时给定类型的子集。
type Partial<T> = {[P in keyof T]?: T[P];}; // 这里无需手动写,本身已经存在interface Person {name: string;age?: number;weight?: number;}type PartialPerson = Partial<Person>;// 相当于interface PartialPerson {name?: string;age?: number;weight?: number;}
Required
Required 可以将给定类型的所有属性都变成必填的。
type Required<T> = {[P in keyof T]-?: T[P];} // 这里无需手动写,本身已经存在interface Person {name: string;age?: number;weight?: number;}type ReuiredPerson = Required<Person>;// 相当于interface RequiredPerson {name: string;age: number;weight: number;}
映射类型在键值的后面使用了一个 - 符号,- 与 ? 组合起来表示去除类型的可选属性,因此给定类型的所有属性都变为了必填。
Readonly
Readonly 将给定类型的所有属性设置为只读,给定类型的属性不可以被重选赋值。
type Readonly<T> = {readonly [P in keyof T]: T[P];} // 这里无需手动写,本身已经存在interface Person {name: string;age?: number;weight?: number;}type NewPerson = Readonly<Person>;// 相当于interface ReadonlyPerson {readonly name: string;readonly age?: number;readonly weight?: number;}
Pick
Pick 将给定的类型中选取指定的键值,然后组成一个新的类型
type Pick<T, K extends keyof T> = {[P in K]: T[P];} // 这里无需手动写,本身已经存在interface Person {name: string;age?: number;weight?: number;}type NewPerson = Pick<Person, 'name' | 'age'>// 相当于interface NewPerson {name: string;age?: number;}
Omit
Omit 将返回去除指定键值之后的新类型。
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>; // 这里无需手动写,本身已经存在interface Person {name: string;age?: number;weight?: number;}type NewPerson = Omit<Person, 'weight'>;// 相当于interface NewPerson {name: string;age?: number;}
Exclude 工具类型的作用就是从入参 T 属性的联合类型中排除入参 K 指定的若干属性。
联合类型
Exclude
Exclude 从联合类型中去除指定的类型。
interface Person {name: string;age?: number;weight?: number;}type Exclude<T, U> = T extends U ? never : T; // 这里无需手动写,本身已经存在type T = Exclude<'a' | 'b' | 'c', 'a'>; // => 'b' | 'c'type NewPerson = Omit<Person, 'weight'>;// 相当于type NewPerson = Pick<Person, Exclude<keyof Person, 'weight'>>;// 其中type ExcludeKeys = Exclude<keyof Person, 'weight'>; // => 'name' | 'age'
Extract
Extract 从联合类型中选取指定的类型
type Extract<T, U> = T extends U ? T : never;type T = Extract<'a' | 'b' | 'c', 'a'>; // => 'a'
基于 Extract 实现一个获取接口类型交集的工具类型。
type Intersect<T, U> = {[K in Extract<keyof T, keyof U>]: T[K];};interface Person {name: string;age?: number;weight?: number;}interface NewPerson {name: string;age?: number;}type T = Intersect<Person, NewPerson>;// 相当于type T = {name: string;age?: number;};
NoNullable
NoNullable 的作用是从联合类型中去除 null 和 undefined 的类型。
type NewNonNullable<T> = T extends undefined | null ? never : T;type NewNonNullable1<T> = Exclude<T, undefined | null>;type N = NewNonNullable<string | number | null | undefined>;const NCONST: N= 1;
Record
Record 用于生成接口类型,传入的泛型参数分为作为接口类型的属性和值。
type Record<K extends keyof any, T> = {[P in K]: T;};type MenuKey = 'home' | 'about' | 'more';interface Menu {label: string;hidden?: boolean;}const menus: Record<MenuKey, Menu> = {about: { label: '关于' },home: { label: '主页' },more: { label: '更多', hidden: true },};
函数类型
ConstructorParameters
ConstructorParameters,获取构造函数的参数
class ColorClass {constructor(name: string, age: number, isChina: boolean) {}}let params: ConstructorParameters<typeof ColorClass>;// let params: [string, number, boolean]
Parameters
获取函数的参数。Parameters 可以用来获取函数的参数并返回
function Fn(name: string, age: number, isChina: boolean) {}let fnP: Parameters<typeof Fn>;// let fnP: [string, number, boolean]
ReturnType
获取函数的返回类型。
function Fn(name: string, age: number, isChina: boolean) {return 1;}let returnType: ReturnType<typeof Fn>;// let returnType: number
ThisParameterType
ThisParameterType 获取函数 this 参数类型
function Fn(this: Window, name: string, age: number, isChina: boolean) {return 1;}let thisParameterType: ThisParameterType<typeof Fn>;// let thisParameterType: Window
ThisType
在对象字面量上指定 this 的类型。
注意:如果你想使用这个工具类型,那么需要开启noImplicitThis的 TypeScript 配置。
OmitThisParameter
OmitThisParameter 用来去除函数参数中 this 类型。
字符串类型
模板字符串
注意:TypeScript 自 4.1版本起开始支持模板字符串字面量类型。
// 转换字符串字面量到大写字母type Uppercase<S extends string> = intrinsic;// 转换字符串字面量到小写字母type Lowercase<S extends string> = intrinsic;// 转换字符串字面量的第一个字母为大写字母type Capitalize<S extends string> = intrinsic;// 转换字符串字面量的第一个字母为小写字母type Uncapitalize<S extends string> = intrinsic;type T0 = Uppercase<'Hello'>; // => 'HELLO'type T1 = Lowercase<T0>; // => 'hello'type T2 = Capitalize<T1>; // => 'Hello'type T3 = Uncapitalize<T2>; // => 'hello'
