TypeScript中{[key:string]:any}与{[key:number]:any}是否无差异?
为什么字符串键的对象能赋值给数字索引签名的变量?
我是TypeScript新手,发现一个奇怪的语言现象。我编写了如下代码,它竟能编译运行:
let x: { [key: string]: any } = {'hi': 'bye'} let y: { [key: number]: any} = x;
这是因为TypeScript在处理对象索引签名时,完全对齐了JavaScript的底层运行时行为:
- 在JavaScript中,对象的所有键最终都会被转换为字符串类型存储。哪怕你用数字作为键,比如
obj[123],本质上和obj["123"]是完全等价的。 - TypeScript的类型系统针对这一点做了兼容设计:带有字符串索引签名的对象,被认为可以覆盖数字索引的访问场景——因为数字索引最终会转为字符串去匹配对象的键,而字符串索引签名已经包含了所有可能的字符串键(包括数字转换而来的)。
- 反过来,如果是数字索引签名的对象,就不能赋值给字符串索引签名的变量,因为并非所有字符串都能被解析为有效的数字,无法保证访问的安全性。
内容的提问来源于stack exchange,提问作者CrazySynthax
相关产品推荐
相关产品推荐

