类型工具

Awaited<Type>

Awaited<Type> 用来取出 Promise 的返回值类型。

type A = Awaited<Promise<string>>;  // string
type B = Awaited<Promise<Promise<number>>  // number

如果它的参数类型不是 Promise, 那么就会原样返回。

type C = Awaited<number | Promise<boolean>>;  // number| boolean

ConstructorParameters<Type>

ConstructorParameters<Type> 用于提取构造方法 Type 的参数类型,组成一个元组类型返回。

// [x: string, y: number]
type T1 = ConstructorParameters<new (x: string, y: number) => object>;

// [x?: string, y?: number]
type T2 = ConstructorParameters<new (x?: string, y?: number) => object>;

它可以返回一些内置构造方法的参数类型:

// [message?: string]
type T1 = ConstructorParameters<ErrorConstructor>;

// string[]
type T2 = ConstructorParameters<FunctionConstructor>;

// [pattern: string|RegExp, flags?: string]
type T3 = ConstructorParameters<RegExpConstructor>;

对于 anynever 两个特殊值,分别返回 unknown[]never

Exclude<UnionType, ExcludedMembers>

Exclude<UnionType, ExcludedMembers> 用来从联合类型 UnionType 中排除 ExcludedMembers,组成一个新的联合类型返回。

Extract<Type, Union>

Extract<Type, Union> 用来从联合类型 Union 中提取 Type,组成一个新的联合类型返回。

如果参数类型 Union 不包含在联合类型 UnionType 中,则返回 never 类型。

Instancetype<Type>

Instancetype<Type> 提取构造函数的返回值类型(即实例类型),参数 Type 是一个构造函数,等同于构造函数 ReturnType<Type>

在上面示例中, typeof CC 的构造方法类型,然后 InstanceType 就能获得到 C 的实例类型。

如果类型参数不是构造方法,就会报错。

如果类型参数是any或 never 两个特殊值,分别返回 any 和 never。

NonNullable<Type>

NonNullable<Type> 用来从联合类型 Type 中排除 nullundefined,组成一个新的类型返回。也就是说返回 Type 的非空类型版本。

Omit<Type, Keys>

Omit<Type, Keys> 用来从类型 Type 中排除 Keys,组成一个新的类型返回。

OmitThisParameter<Type>

OmitThisParameter<Type> 用来从函数类型 Type 中排除 this 参数,组成一个新的类型返回。

如果函数没有 this 参数,则返回原始函数类型。

Parameters<Type>

Parameters<Type> 提取构造函数 Type 的参数类型,组成一个元组类型返回。

对于 anynever 两个特殊值,分别返回 unknown[]never

Partial<Type>

Partial<Type> 用来将类型 Type 中的所有属性变成可选,组成一个新的类型返回。

Pick<Type, Keys>

Pick<Type, Keys> 用来从类型 Type 中提取 Keys,组成一个新的类型返回。

指定的键名 Keys 必须是对象键名 Type 里面已经存在的键名,否则会报错。

Readonly<Type>

Readonly<Type> 用来将类型 Type 中的所有属性变成只读,组成一个新的类型返回。

我们可以自定义类型工具Mutable<Type>,将参数类型的所有属性变成可变属性。

Record<Keys, Type>

Record<Keys, Type> 用来创建一个类型为 Type,键名为 Keys 的对象,组成一个新的类型返回。

Required<Type>

Required<Type> 用来将类型 Type 中的所有属性变成必选,组成一个新的类型返回。

Required<Type> 的实现如下:

在上面代码中,符号 -? 表示去除可选属性的"问号",使其变成可选属性。相对应的,符号 +? 表示增加可选属性的"问号",使其变成必选属性。

因此,前面的 Partial<Type> 的定义也可以写成下面这样。

ReadonlyArray<Type>

ReadonlyArray<Type> 用来生成一个只读数组类型,类型参数 Type 表示数组成员类型。

ReturnType<Type>

ReturnType<Type> 提取函数类型 Type 的返回值类型,作为一个新类型返回。

如果参数类型是泛型函数,返回值取决于泛型类型。如果泛型不带限制条件,就会返回 unknown

anynever 两个特殊值分别返回 anynever

ThisParameterType<Type>

ThisParameterType<Type> 提取函数类型中 this 参数的类型。

如果函数没有 this 参数,则返回 unknown

ThisType<Type>

ThisType<Type> 不返回类型,只用来跟其他类型组成交叉类型,用来提示 TypeScript 其他类型里面的 this 类型。

在上面的示例中,变量 helperFunctions 的类型是一个正常的对象类型与 ThisType 类型组成的交叉类型。

注意:使用这个类型工具时,必须打开 noImplicitThis 设置。

字符串类型工具

Uppercase<StringType>

Uppercase<StringType> 将字符串类型的每个字符转为大写。

Lowercase<StringType>

Lowercase<StringType> 将字符串的每个字符转为小写。

Capitalize<StringType>

Capitalize<StringType> 将字符串的第一个字符转为大写。

Uncapitalize<StringType>

Uncapitalize<StringType> 将字符串的第一个字符转为小写。

这有帮助吗?