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

如何基于继承泛型的参数推导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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 23:35:41