什么是 TypeScript 的索引访问类型?

2024-08-26 10:55:56 390
TypeScript 的索引访问类型(Indexed Access Types)允许我们通过指定某个属性的键来访问类型中的某个属性的类型。这种特性可以使我们在类型系统中动态地引用某个类型的部分内容,类似于在 JavaScript 中通过 `obj[key]` 访问对象属性的值。

基本用法

索引访问类型的语法是使用 T[K] 的形式,其中:

  • T 是一个类型(通常是对象类型)。
  • K 是一个键类型(通常是 T 的属性名的类型)。
type Person = {
    name: string;
    age: number;
    isStudent: boolean;
};

// 使用索引访问类型获取 `Person` 中 `name` 的类型
type NameType = Person["name"];  // string

// 使用索引访问类型获取 `Person` 中 `age` 的类型
type AgeType = Person["age"];    // number

示例 1: 动态获取类型

索引访问类型可以通过键来动态获取对象类型中的某个属性类型。

type Person = {
    name: string;
    age: number;
    isStudent: boolean;
};

type PropertyKey = "name" | "age";
type PropertyType = Person[PropertyKey];  // string | number

解释:

  • Person[PropertyKey] 的类型是 string | number,因为 PropertyKey 可以是 "name""age",对应的类型分别是 stringnumber

示例 2: 使用 keyof 和索引访问类型

你可以结合 keyof 操作符来获取对象的所有键,然后通过索引访问类型提取其对应的值的类型。

type Person = {
    name: string;
    age: number;
    isStudent: boolean;
};

type PersonKeys = keyof Person;  // "name" | "age" | "isStudent"
type PersonValues = Person[PersonKeys];  // string | number | boolean

解释:

  • keyof Person 返回 "name" | "age" | "isStudent",表示 Person 类型的所有键。
  • Person[PersonKeys] 表示 Person 类型中所有键对应的值的类型,因此得到 string | number | boolean

示例 3: 访问嵌套对象的属性类型

你还可以使用索引访问类型来获取嵌套对象中的属性类型。

type Company = {
    name: string;
    location: {
        city: string;
        country: string;
    };
};

type CityType = Company["location"]["city"];  // string

解释:

  • Company["location"]["city"] 通过两次索引访问直接获取了 location 对象中 city 属性的类型。

总结

索引访问类型使得 TypeScript 类型系统更为灵活和强大,可以动态地访问和操作复杂对象类型的某些部分。它允许你通过键来提取某个属性的类型,并且可以结合 keyof 等操作符来实现动态和强类型的类型操作。