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

TypeScript如何推断传入构造函数的函数参数类型并保留泛型信息

解法

1. 自定义类场景实现预期校验

直接用内置的ConstructorParameters工具类结合Parameters即可实现你要的SomeUtilityType:

type SomeUtilityType<T extends abstract new (...args: any) => any> = Parameters<ConstructorParameters<T>[0]>

let dependencyArgs: SomeUtilityType<typeof myClass>

class myClass {
  constructor(dependency: (a: (value: number) => void, b: () => void) => void) {
    dependency((value: number) => {console.log(value)}, () => {})
  }
}

new myClass((...args) => dependencyArgs = args)
dependencyArgs?.[0]("a") // 类型报错,参数必须为number
dependencyArgs?.[0](1) // 校验通过

2. 带泛型的Promise场景解决泛型丢失问题

之前报错的两个核心原因:

  • ConstructorParameters要求传入构造函数类型,Promise<number>是Promise实例类型,不是构造函数类型,所以会触发约束错误
  • 直接用typeof Promise(也就是PromiseConstructor)时如果不指定泛型参数,会默认用unknown作为泛型值,导致类型不匹配

针对该场景我们可以自定义接收泛型的工具类实现:

type PromiseExecutorParams<T> = Parameters<ConstructorParameters<PromiseConstructor>[0]<T>>

let resolveReject: PromiseExecutorParams<number>
new Promise<number>((...rs) => resolveReject = rs) // 不再报错

resolveReject[0](1) // 校验通过
resolveReject[0]("a") // 类型报错,参数需要满足 number | PromiseLike<number>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:18:02