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

