为何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
相关产品推荐
相关产品推荐

