如何基于TypeScript接口的键设置函数返回值?
问题分析与解决
核心问题
你的类型错误源于返回类型定义偏差:
Pick<API, T>获取的是API接口中对应T键的方法本身的类型(比如foo对应的是() => Promise<boolean>),而非方法执行后的返回值类型。- 因此函数返回的
Promise<boolean>/Promise<number>无法匹配Promise<Pick<API, T>>,导致类型校验报错,同时返回类型推断也不符合预期。
修正方案
需要使用TypeScript内置类型工具提取方法的返回值和参数类型,调整proxy函数的类型定义:
完整修正代码
interface API { foo: () => Promise<boolean>, bar: (num: number) => Promise<number> } const theApi: API = { foo: () => Promise.resolve(true), bar: (num) => Promise.resolve(num * 2) } async function proxy<T extends keyof API>( method: T, ...args: Parameters<API[T]> ): Promise<ReturnType<API[T]>> { return theApi[method](...args); } // 类型推断正确:Promise<boolean> const myReturn = proxy('foo'); // 支持参数传递,且类型自动校验:必须传入number类型 const barReturn = proxy('bar', 10);
关键类型工具说明
Parameters<API[T]>:提取API[T]方法的参数类型,作为proxy函数的可变参数类型,保证参数类型与原方法完全匹配。ReturnType<API[T]>:提取API[T]方法的返回值类型,作为proxy函数的返回类型,实现精准的类型推断。
内容的提问来源于stack exchange,提问作者Dave Stein
相关产品推荐
相关产品推荐

