TypeScript 嵌套对象方法的泛型函数参数类型收窄问题求助
报错原因
TypeScript 类型系统无法默认推导 API[T][K] 是可调用的函数类型。虽然你定义的 api 对象嵌套属性都是方法,但泛型约束中仅限制了 K 是 API[T] 的键,没有约束该键对应的值为函数类型,而 Parameters 工具类要求传入的参数必须是函数类型,因此触发类型报错。
解决方案
先定义一个工具类型,提取对象中所有值为函数的键:
type FunctionKeys<T> = { [K in keyof T]: T[K] extends (...args: any) => any ? K : never }[keyof T]
再改写泛型约束,限制 K 只能是 API[T] 下的函数属性键:
type API = typeof api; function createRequest< T extends keyof API, K extends FunctionKeys<API[T]> >(key: T, method: K, params: Parameters<API[T][K]>[0]) { // 调用实现,此处类型断言是安全的,因为泛型已经保证了类型匹配 return (api[key][method] as (p: typeof params) => unknown)(params) }
效果验证
调用时会自动推导参数类型:
createRequest('message', 'post', '测试内容') // 合法 createRequest('message', 'post', 123) // 类型错误,预期 string createRequest('events', 'get', 1) // 合法 createRequest('events', 'get', '1') // 类型错误,预期 number
如果需要支持多参数的方法,可以改写为 rest 参数形式:
function createRequest< T extends keyof API, K extends FunctionKeys<API[T]> >(key: T, method: K, ...args: Parameters<API[T][K]>) { return (api[key][method] as (...args: typeof args) => unknown)(...args) }
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

