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

如何根据输入指定TypeScript函数的返回接口?

解决TypeScript根据输入参数匹配对应返回接口的问题

你的核心需求是让init方法的第二个参数(回调函数)根据第一个参数dep里的元素,约束回调的参数name只能是dep中的值,且返回值必须匹配Itest中对应键的类型。原代码的问题在于泛型定义位置错误,且没有建立dep和回调函数之间的类型关联。

修正后的代码实现

interface Itest {
  a: { a: number };
  b: { b: number };
  c: { c: number };
  d: { d: number };
}

type Tname = keyof Itest;

interface Isdk {
    // 将init定义为泛型方法,D约束为Tname的数组类型
    init<D extends Tname[]>(
        dep: D,
        param: (name: D[number]) => Itest[D[number]] | undefined
    ): void;
}

const SDK: Isdk = {
    init: (dep, param) => {},
};

// 测试1:dep为['a'],回调只能处理name='a',返回值必须符合{ a: number }
SDK.init(['a'], (name) => {
    // name的类型被推导为'a',其他分支会报错
    return { a: 1 }; // 符合类型要求
});

// 测试2:dep为['a', 'b'],回调需处理'a'和'b'两种情况
SDK.init(['a', 'b'], (name) => {
    if (name === 'a') {
        return { a: 1 }; // 正确
    }
    if (name === 'b') {
        return { b: 2 }; // 正确
    }
    // 此处不能返回不符合类型的值,比如{ a: 1 }当name是'b'时会报错
    return undefined;
});

关键说明

  • 将init方法定义为泛型方法,通过泛型D捕获传入的dep数组的具体元素类型,而非宽泛的Tname[]
  • 回调函数的参数name被约束为D[number],即dep数组中的所有可能值,TS会自动推导其具体类型
  • 回调的返回值绑定为Itest[D[number]],确保每个name对应的返回值严格匹配Itest中定义的接口
  • 当dep传入具体数组时,TS会自动校验回调函数的参数和返回值,不符合类型的代码会直接报错

内容的提问来源于stack exchange,提问作者Aero Wang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 11:40:32