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

TypeScript使用ReplaceReturnType修改泛型对象方法返回类型报错问题

报错原因
  • 你的ReplaceReturnType工具类型要求第一个传入的泛型必须是函数类型,但TService的泛型参数Obj没有添加任何约束,TypeScript无法保证Obj的每一个属性都是函数类型,因此传入Obj[Prop]时触发了类型不满足约束的报错。
  • 额外说明:原代码中映射类型的as Prop属于冗余写法,可以直接省略。
修复方案

你可以根据实际场景二选一:

场景1:确保传入的Obj所有属性都是函数

直接给TService的泛型Obj添加约束即可:

type ReplaceReturnType<T extends (...a: any) => any, TNewReturn> = (
  ...a: Parameters<T>
) => TNewReturn

// 给Obj添加约束,要求所有属性都是函数
type TService<Obj extends Record<keyof any, (...args: any[]) => any>> = {
  [Prop in keyof Obj]: ReplaceReturnType<Obj[Prop], Iterator>
}

场景2:Obj可能包含非函数属性,希望非函数属性保留原类型

修改ReplaceReturnType为条件类型,内部自动判断是否为函数类型,不需要提前加泛型约束,兼容性更强:

// 用条件类型做类型判断,非函数类型直接返回原值
type ReplaceReturnType<T, TNewReturn> = T extends (...args: infer P) => any 
  ? (...args: P) => TNewReturn 
  : T

type TService<Obj> = {
  [Prop in keyof Obj]: ReplaceReturnType<Obj[Prop], Iterator>
}
使用示例
// 测试原始类型
type OriginalObj = {
  fetchUser: (id: number) => {name: string}
  fetchList: (page: number) => {id: number}[]
  version: string
}

// 处理后的类型
type ServiceObj = TService<OriginalObj>
// 等价于:
// {
//   fetchUser: (id: number) => Iterator
//   fetchList: (page: number) => Iterator
//   version: string // 非函数属性保留原类型
// }

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:24:01