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

