如何基于继承泛型的参数推导TypeScript返回类型?
问题描述
我定义了一个返回函数的类型:
type OuterFunction<OuterParams extends [...any], InnerParams extends [...any]> = (outerParams: [...OuterParams]) => (innerParams: [...InnerParams]) => Promise<boolean>
我尝试创建另一个函数,接收OuterFunction和OuterParams并返回内部函数:
type OuterParamsOf<T> = T extends OuterFunction<infer Deps, any[]> ? Deps : never function someFunction<T extends OuterFunction<any[], any[]>>(func: T, deps: [...OuterParamsOf<T>]): ReturnType<T> { return func(...deps) }
但出现错误:
Type '(...args: any[]) => Promise
' is not assignable to type 'ReturnType '
忽略错误调用someFunction能正常工作,请问:
- 为何会出现这个错误?
- 该如何基于
func参数正确设置返回类型?
错误原因
TypeScript无法精准推断func(...deps)的类型与ReturnType<T>完全匹配。虽然T继承自OuterFunction<any[], any[]>,但ReturnType<T>会被推断为对应特定InnerParams的具体函数类型,而func(...deps)的返回值被宽泛判定为(...args: any[]) => Promise<boolean>,两者类型约束程度不一致,导致兼容性报错。
解决方法
方案一:显式约束泛型参数
直接将OuterParams和InnerParams作为泛型参数,让TypeScript精准追踪类型信息,避免通过T间接约束:
type OuterFunction<OuterParams extends [...any], InnerParams extends [...any]> = (outerParams: [...OuterParams]) => (innerParams: [...InnerParams]) => Promise<boolean> function someFunction<O extends [...any], I extends [...any]>( func: OuterFunction<O, I>, deps: [...O] ): ReturnType<OuterFunction<O, I>> { return func(...deps) }
方案二:提取InnerParams类型
如果要保留T作为泛型参数,可以新增条件类型提取InnerParams,显式指定返回类型的结构:
type OuterFunction<OuterParams extends [...any], InnerParams extends [...any]> = (outerParams: [...OuterParams]) => (innerParams: [...InnerParams]) => Promise<boolean> type OuterParamsOf<T> = T extends OuterFunction<infer Deps, any[]> ? Deps : never type InnerParamsOf<T> = T extends OuterFunction<any[], infer Params> ? Params : never function someFunction<T extends OuterFunction<any[], any[]>>( func: T, deps: [...OuterParamsOf<T>] ): (innerParams: [...InnerParamsOf<T>]) => Promise<boolean> { return func(...deps) }
两种方案都能让TypeScript准确识别返回类型,消除报错。
内容的提问来源于stack exchange,提问作者Naoric
相关产品推荐
相关产品推荐

