typescript索引访问类型通过type["key"]在编译期提取属性类型,要求key为字面量且存在于type中;支持联合键、keyof、嵌套访问及泛型,但不支持变量键或不存在属性。

在 TypeScript 中,索引访问类型(Index Access Type)通过 [key] 语法从类型中提取某个属性的类型,而不是运行时的值。它不是用来“获取属性定义”的反射操作,而是编译期的类型推导工具。
用法:通过属性名字符串字面量提取类型
基本形式是 Type["propertyName"]。要求属性名必须是类型 Type 上真实存在的、字面量类型的键(如字符串字面量或联合字面量),否则会报错。
例如:
完整的Galileo AI平台 TypeScript/JS SDK 参考,用于评估、观察和保护 GenAI 应用。适用于构建 Node.js 或 TypeScript 项目。
type User = {
id: number;
name: string;
isActive: boolean;
};
type IdType = User["id"]; // number
type NameType = User["name"]; // string
type StatusType = User["isActive"]; // boolean
支持联合键与 keyof 配合动态提取
可以结合 keyof 和联合类型,一次性获取多个属性的类型并组成新类型:
type PartialUser = User["id" | "name"]; // number | string type AllPropTypes = User[keyof User]; // number | string | boolean
注意:User[keyof User] 是所有属性类型的联合,不是交集 —— 这是常见误解点。
嵌套对象和泛型中的索引访问
支持多层访问,但每层都必须有明确的类型定义:
type ApiResponse = {
data: {
user: User;
timestamp: Date;
};
};
type UserType = ApiResponse["data"]["user"]; // User
type TimestampType = ApiResponse["data"]["timestamp"]; // Date
// 泛型中也很实用
type PropOf<t k extends keyof t> = T[K];
type NameOfUser = PropOf<user>; // string
</user></t>
注意事项与常见陷阱
- 不能用变量代替字面量键(如
const key = "name"; type T = User[key];❌),TS 无法推断变量值是否为合法键,需用泛型约束 - 如果访问不存在的属性(如
User["email"]),TS 报错:Type '"email"' cannot be used to index type 'User' - 可选属性(
email?: string)被索引时,结果类型自动包含undefined(除非启用strictNullChecks: false) - 索引访问不适用于任意字符串(
string类型键),除非目标类型声明了字符串索引签名(如[k: string]: any)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










