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

为何TypeScript中Record<string, number>索引访问返回number而非number|undefined?

TypeScript Record类型的键存在性推断问题

先看示例代码:

declare const foo: Record<string, number>

const x = foo['some-key']

TypeScript会判定x的类型是number,但实际上如果对象里不存在some-key这个键,x应该是number | undefined。哪怕开启了strict: true模式,TypeScript还是会给出这种看似不符合实际的推断,原因其实是TypeScript对Record类型的定义和索引签名的行为逻辑决定的:

  • Record<K, T>的底层定义是{ [P in K]: T },这本质上是一个索引签名。在TypeScript的设计里,索引签名的含义是「所有符合K类型的键,对应的属性值必然是T类型」,它是一种对类型的“承诺”,而不是描述对象实际包含哪些键。
  • 开启strict: true虽然会启用strictNullChecks,让未初始化的变量可能包含undefined,但这并不改变索引签名的行为逻辑——TypeScript依然会认为,只要是符合索引类型的键,访问时就一定能得到对应的T类型值,不会自动加上undefined。

如果想要表达「对象可能包含某些字符串键,值为number;不存在的键对应undefined」,可以改用Partial<Record<string, number>>,或者直接定义类型为{ [key: string]: number | undefined }。

内容的提问来源于stack exchange,提问作者callum

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 02:50:40