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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 08:27:10