如何根据输入指定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
相关产品推荐
相关产品推荐

