如何声明可使用任意类型键的TypeScript记录?
用任意对象做键?用Map就对了
TypeScript里普通对象的索引签名只允许string、number或symbol类型,这是因为JavaScript底层会把对象键自动转成字符串(比如window会变成[object Window]),所以你写的{ [key: unknown]: string }会触发类型错误。
想要用任意对象作为键存储值,直接用Map就可以,它原生支持任意类型键:
const obj = new Map<unknown, string>(); obj.set(window, "Some Value"); // 用原对象就能取到对应值 console.log(obj.get(window)); // 输出 "Some Value"
为什么普通对象没法实现?
- TypeScript严格限制了普通对象的索引类型,不允许
unknown这种非原始类型作为索引签名,这是为了符合JS的实际运行机制。 - 就算用
any绕过类型检查,实际存储的键也会是对象的字符串表示,无法通过原对象精准取值,完全达不到你想要的效果。
内容的提问来源于stack exchange,提问作者Tristan F.-R.
相关产品推荐
相关产品推荐

