TypeScript中如何让构造函数正确推断泛型参数类型?
问题
现有TypeScript代码中,HMap泛型类的构造函数存在重载。当传入对象{ a: 1, b: 2 }实例化HMap时,TypeScript推断其键类型为unknown,请问如何修改代码使其正确识别键类型为string?
原代码:
class HMap<K, V> { constructor(items: Record<string, V>) constructor(items: [K, V][]) constructor(items: Record<string, V> | [K, V][]) { } } const h = new HMap({a: 1, b: 2}) // => HMap<unknown, number>
解决方法
问题根源在于第一个构造函数重载的Record<string, V>没有和泛型参数K建立关联,TypeScript无法从这个重载分支推断出K的具体类型,只能默认赋值为unknown。
修改时只需将第一个重载的Record<string, V>替换为Record<K, V>,让对象的键类型直接绑定到泛型K上:
class HMap<K, V> { constructor(items: Record<K, V>) constructor(items: [K, V][]) constructor(items: Record<K, V> | [K, V][]) { } } const h = new HMap({a: 1, b: 2}) // => HMap<string, number>
如果需要遵循原生Map的键类型规范(仅允许string/number/symbol),可以给K添加泛型约束:
class HMap<K extends string | number | symbol, V> { constructor(items: Record<K, V>) constructor(items: [K, V][]) constructor(items: Record<K, V> | [K, V][]) { } } const h = new HMap({a: 1, b: 2}) // => HMap<string, number>
修改后,TypeScript就能从传入对象的键中正确推断出K为string类型。
内容的提问来源于stack exchange,提问作者Alex Craft
相关产品推荐
相关产品推荐

