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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 04:48:11