TypeScript细碎知识点:infer 常规用法

[infer P, ... infer _]中infer P获取的是第一个元素的类型,而...infer _获取的是数组其他剩余元素的数组类型;

!!!特别说明下,我们例子汇总不需要使用其他元素的类型,所以用_。

示例:

//定义

type InferFirst = T extends [infer P, ...infer _] ? P : never

//示例

type result = InferFirst<[3, 2, 1]>; // 3

🐹 推断数组(或者元组)最后一个元素的类型

定义:

type InferLast = T extends [...infer _, infer Last] ? Last : never;

这个 和 推断数组第一个元素的类型 类似,...infer _获取的是最后一个元素之前的所有元素类型,infer Last获取的是最后一个元素的类型。

示例:

//定义

type InferLast = T extends [...infer _, infer Last] ? Last : never;

//示例

type result = InferLast<[3, 2, 1]> // 1

2. 函数

🐹 推断函数类型的参数

定义:

type InferParameters = T extends (...args: infer R) => any ? R : never;

...args 代表的是函数参数组成的元组, infer R代表的就是推断出来的这个函数参数组成的元组的类型。

TS 已内置,名字叫Parameters

示例:

//定义

type InferParameters = T extends (...args: infer R) => any ? R : never;

//示例

type result = InferParameters<((arg1: string, arg2: number) => void)>; // [string, number]

🐹 推断函数类型的返回值

定义:

type InferReturnType = T extends (...args: any) => infer R ? R : never;

和前面的推断函数类型的参数类似,=> 后面的infer R代表的就是推断出来的函数的返回值类型。

TS 已内置,名字叫ReturnType

示例:

//定义

type InferReturnType = T extends (...args: any) => infer R ? R : never;

//示例

type result = InferReturnType<() => string>; // string

🐹 推断函数类型的构造函数参数类型

定义:

type InferConstructor = T extends new (...args: infer P) => any ? P : never

我们想获取构造函数的参数类型,是不是只要把infer P标注在构造函数参数的位置就可。这个可以参考推断函数参数去理解

TS 已内置,名字叫ConstructorParameters

示例:

//定义

type InferConstructor = T extends new (...args: infer P) => any ? P : never

//示例

class People {

name: string;

constructor(name: string) {

this.name = name

}

}

//定义类型

type result = InferConstructor // string

🐹 4. 推断函数类型的实例类型(InstanceType)

定义:

type InferInstanceType = T extends new (...args: any) => infer P ? P : never;

我们想获取构造函数People的实例类型,这个可以参考函数推断返回值去理解。

TS 已内置,名字叫InstanceType

示例:

//定义类型

type InferInstanceType = T extends new (...args: any) => infer P ? P : never;

//示例

class People {

name: string;

constructor(name: string) {

this.name = name

}

}

type result = InferInstanceType //People

🐹 5. 获取this参数的类型(ThisParameterType)

定义:

type InferFuncThisType = T extends (this: infer P, ...args: any) => any ? P : T;

TS 已内置,名字叫ThisParameterType

示例:

// 定义

type InferFuncThisType = T extends (this: infer P, ...args: any) => any ? P : T;

//示例

function fn1(this: { name: string; age: number }) {

this.name = "Type-Infer";

this.age = 13;

}

type result = InferFuncThisType;

3. Promise

🐹 推断Promise成功值的类型

定义:

type InferPromise = T extends Promise ? U : never;

示例:

//定义

type InferPromise = T extends Promise ? U : never;

//示例

type result = InferPromise>; // string

4. 模板类型

🐹 推断字符串字面量类型的第一个字符对应的字面量类型

定义:

type InferString = T extends `${infer First}${infer _}` ? First : [];

示例:

//定义

type InferString = T extends `${infer First}${infer _}` ? First : [];

//示例

type result = InferString<"Johnny">; // J

🐹 去除字符串前面的所有空格

定义: