[key: string]: T 索引签名
最后更新:2026-10-22
[key: string]: T 索引签名
索引签名描述"键名不固定、但键的值类型统一"的对象,比如字典、计数器、配置映射。写法是 [key: string]: T。
| 分组 | 类型组合 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
const dict: { [key: string]: number } = {};
dict["a"] = 1;
// 等价的工具类型写法
const same: Record<string, number> = {};
⚙️ 参数
| [key: string] | 键类型只能是 string、number、symbol 或其联合;key 名字可自取 |
|---|---|
| [i: number] | [i: number]: T 描述"按下标取值"的结构;数字索引值类型必须是字符串索引的子类型 |
返回值:无返回值——索引签名是纯类型层概念,不产生任何运行时代码。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
180 0
(转译后运行输出;scores["Bob"] 类型是 number,strict 下不报错——索引签名声明"所有键都存在")
💡 要点
ℹ️ 说明 Record<string, number> 与索引签名 { [key: string]: number } 含义相同,工具类型写法更常用。
⚠️ 注意 索引签名让"任何键"都合法:strict 下 scores["Bob"] 也不报错,typo 会被放过。键名集合有限时改用 Record<"a" | "b", T> 或映射类型。
💡 提示 值类型不统一时写成联合:{ [key: string]: string | number },读取后再按类型收窄。
🏷️ 相关类型组合
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q 索引签名和 Record<K, V> 什么关系?
A 表达力等价,Record 本质上就是映射类型实现的索引签名。日常写 Record 更简洁,键集合还能精确到字面量联合。
Q 为什么访问不存在的键不报错?
A 索引签名的语义就是"所有 string 键都存在且类型为 T"。要编译器拦 typo,用 Record<"a" | "b", T> 限定键名,或开 noUncheckedIndexedAccess。
Q 数字索引和字符串索引能共存吗?
A 可以,但数字索引的值类型必须是字符串索引值类型的子类型(JS 里数字键最终也是字符串键)。