函数重载无法正确识别带参数构造函数的类类型问题求助
函数重载无法正确识别带参数构造函数的类类型问题求助
我最近在写TypeScript代码时遇到了一个类型推断的问题,卡了好一阵子,想请教一下各位:
我维护了一个Map,里面存的键值对类型比较多样——键可以是字符串、类构造函数等,值则对应不同的类型;特别的是,当键是类构造函数时,对应的值一定是这个类的实例。
为了方便从Map里取值并自动推断类型,我写了一个带重载的test函数,但发现一个奇怪的问题:当传入的类构造函数带有参数时,类型推断就失效了,具体代码如下:
const map = new Map(); function test<T>(key: new (...args: any[]) => T): T; function test<T>(key: unknown): T function test(key: unknown) { return map.get(key); } // 测试部分 class A {} class B { constructor(public foo: string) {} } const aaa = test(A) // 这里能正确推断为 `A` 类型 const bbb = test(B) // 这里却错误地推断为 `unknown` 类型 const ccc = test('C') // 这个推断为 `unknown` 是正确的 const ddd = test<string>('D') // 手动指定泛型后也能正确得到 `string` 类型
我实在想不通为什么带参数的类B不能匹配第一个重载,它明明也是一个构造函数类型啊?有没有大佬能帮我分析下原因,或者给个可行的修复方案?
备注:内容来源于stack exchange,提问作者Ettapp
相关产品推荐
相关产品推荐

