索引访问类型(或索引类型)允许通过语法 T[K] 引用对象中特定属性或任何键的类型。这是创建灵活和类型安全的抽象的强大工具。
type Person = { name: string; age: number; }; type NameType = Person['name']; // string type AgeOrName = Person['age' | 'name']; // number | string
用于编写通用类型和函数:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // 正确的返回类型 } const user = { email: 'a@a.ru', id: 1 }; let id = getProperty(user, 'id'); // id: number
Person['salary'] — 编译时错误。问题: 表达式 type Foo = {a: number, b: string}["a" | "b" | "c"] 的结果类型是什么?
答案: 这个例子会导致编译错误,因为 'c' 不是访问的类型中的键。TypeScript 会抛出错误:
Type '"c"' does not satisfy the constraint '"a" | "b"'.
故事
项目基于类型动态生成表单。在主类型中添加新字段后,没有更新通过键索引的地方,结果某些属性未能反映到表单中,尽管在类型层面期待完整映射。错误仅在运行时表现,而不是在开发阶段。
故事
在数据验证库中使用了通过类型进行的索引访问,但在迁移代码时将一个键从对象移到父级。旧的索引类型导致了编译错误,但该错误仅由于CI中的缓存而在重新构建后出现,并且之前在staging上存在了几周。
故事
错误地认为通过索引访问类型可以访问任何键,即使它没有被明确列出,这导致了动态属性的自动测试生成错误。结果测试没有覆盖部分可能的场景,因为编译器将这些情况抛出为无效。