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
相关产品推荐
相关产品推荐

