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

TypeScript如何禁止Record<string, string>数字索引的自动类型转换?

问题背景

当前在TypeScript中可以编写如下可正常编译运行的代码:

const r: Record<string, string> = {
  "42": "42_value"
};
console.log(r[42]);

运行后输出为:

"42_value"

需求是让console.log(r[42])这一行触发编译报错,禁止Record<string, string>的索引运算符接收数字类型值,关闭number到string的自动转换兼容。

解决方案

TypeScript 原生Record<string, T>允许数字索引是特意设计的兼容行为,匹配JavaScript运行时自动将数字索引转换为字符串的特性,所以默认不会对这种用法抛出错误,你可以通过以下两种方式实现需求:

  • 方案1:自定义严格字符串键字典类型,替代原生Record
    可以自定义一个工具类型,显式禁止数字作为索引:
type StrictStringKeyRecord<V> = {
  [K in string]: V
} & {
  [key: number]: never
}

使用示例:

const r: StrictStringKeyRecord<string> = {
  "42": "42_value"
};
console.log(r[42]); // 编译报错:类型“number”不能作为索引类型“StrictStringKeyRecord<string>”的索引
  • 方案2:使用Map替代普通对象存储键值对
    ES内置的Map类型的键类型约束是严格的,不会兼容JS的隐式类型转换逻辑,完全符合你的需求:
const m = new Map<string, string>();
m.set("42", "42_value");
console.log(m.get(42)); // 编译报错:类型“number”的参数不能赋给类型“string”的参数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 08:15:06