如何创建TypeScript泛型类型提取接口中函数的非void返回类型?
提取接口中函数的返回类型(过滤非函数与void返回值)
假设我有多个接口,例如:
interface ClassA { createMessage(basicInfo: string): string; calculateStuff(a: number, b: number): number; constant: number; someAction(): void; } interface ClassB { createTwoMessages(basicInfo: string): {message1: string, message2: string}; calculateDifferentThing(a: number, b: number): number }
我需要创建一个泛型类型ExtractReturnTypes<T>,实现以下效果:
- 提取接口中所有函数成员的返回类型
- 过滤掉非函数成员(比如
ClassA里的constant) - 过滤掉返回值为
void的函数(比如ClassA里的someAction) - 保留原函数的名称作为新类型的属性名
期望的结果:
type ReturnTypesOfClassA = ExtractReturnTypes<ClassA> // 结果:{createMessage: string, calculateStuff: number} type ReturnTypesOfClassB = ExtractReturnTypes<ClassB> // 结果:{createTwoMessages: {message1: string, message2: string}, calculateDifferentThing: number}
实现代码
type ExtractReturnTypes<T> = { [K in keyof T as T[K] extends (...args: any[]) => infer R ? R extends void ? never : K : never]: T[K] extends (...args: any[]) => infer R ? R : never }
代码解释
- 遍历接口属性:通过
[K in keyof T]遍历目标接口的所有属性名 - 过滤有效属性:
- 先判断属性是否为函数类型:
T[K] extends (...args: any[]) => infer R,同时提取函数的返回类型R - 若返回类型
R是void,则用never排除该属性;否则保留原属性名K
- 先判断属性是否为函数类型:
- 设置属性值类型:对保留的属性,提取对应函数的返回类型
R作为新类型的属性值
测试验证
将泛型与目标接口结合使用,即可得到预期结果:
// 验证ClassA type ReturnTypesOfClassA = ExtractReturnTypes<ClassA> // 类型为 { createMessage: string; calculateStuff: number; } // 验证ClassB type ReturnTypesOfClassB = ExtractReturnTypes<ClassB> // 类型为 { createTwoMessages: { message1: string; message2: string; }; calculateDifferentThing: number; }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

