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

