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

TypeScript修改函数原型方法时inject函数的类型约束错误解决

修复TypeScript inject函数的类型错误

错误原因

原代码中,虽然泛型O已经筛选出T原型中所有函数类型的属性,但TypeScript的泛型推断无法自动确认O[K]必然满足(...args: any) => any的约束,导致赋值给F时报错。

修复方案1:简化泛型结构(推荐)

先定义一个工具类型提取对象中值为函数类型的键,再让func_name约束为该类型,避免中间泛型O带来的推断模糊:

// 工具类型:提取对象中值为函数类型的键
type FunctionKeys<T> = {
  [K in keyof T]: T[K] extends (...args: any) => any ? K : never
}[keyof T];

function inject<T>(
  o: { prototype: T },
  func_name: FunctionKeys<T>,
  func: (ret: ReturnType<T[FunctionKeys<T>]>) => void
) {}

修复方案2:调整原代码的泛型定义

保留原有的泛型结构,去掉F的显式约束(因为O的属性已经确保是函数类型),直接使用ReturnType<O[K]>即可:

function inject<
  T,
  O = {
    [K in keyof T as T[K] extends (...args: any) => any ? K : never]: T[K];
  },
  K extends keyof O = keyof O
>(o: { prototype: T }, func_name: K, func: (ret: ReturnType<O[K]>) => void) {}

更简洁的内联写法

可以把工具逻辑直接内联到泛型约束中,省略单独定义FunctionKeys的步骤:

function inject<T, K extends keyof T>(
  o: { prototype: T },
  func_name: T[K] extends (...args: any) => any ? K : never,
  func: (ret: ReturnType<Extract<T[K], (...args: any) => any>>) => void
) {}

这里Extract<T[K], (...args: any) => any>确保只提取函数类型,让ReturnType可以正常推导返回值类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 17:31:07