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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 00:39:03