You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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
}

代码解释

  1. 遍历接口属性:通过[K in keyof T]遍历目标接口的所有属性名
  2. 过滤有效属性:
    • 先判断属性是否为函数类型:T[K] extends (...args: any[]) => infer R,同时提取函数的返回类型R
    • 若返回类型R是void,则用never排除该属性;否则保留原属性名K
  3. 设置属性值类型:对保留的属性,提取对应函数的返回类型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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 08:31:01