Skip to content

索引访问类型

我们可以使用一个索引访问类型来查询另一个类型上的特定属性:

typeScript
type Person = { age: number; name: string; alive: boolean };
type Age = Person["age"];

索引类型本身就是一个类型,所以我们可以完全使用 unions、 keyof 或者其他类型。

typeScript
interface Person {
  name: string
  age: number
  alive: boolean
}

// type I1 = string | number
type I1 = Person["age" | "name"];
const i11:I1 = 100
const i12:I1 = ''

// type I2 = string | number | boolean
type I2 = Person[keyof Person];
const i21:I2 = ''
const i22:I2 = 100
const i23:I2 = false

// type I3 = Person[AliveOrName];
type AliveOrName = "alive" | "name";
const aon1:AliveOrName = 'alive'
const aon2:AliveOrName = 'name'

如果你试图索引一个不存在的属性,你甚至会看到一个错误:

typescript
type I1 = Person["alve"];

另一个使用任意类型进行索引的例子是使用 number 来获取一个数组元素的类型。我们可以把它和 typeof 结合起来,方便地获取一个数组字面的元素类型。

typescript
const MyArray = [
  { name: "Alice", age: 15 },
  { name: "Bob", age: 23 },
  { name: "Eve", age: 38 },
];

/* type Person = { 
    name: string; 
    age: number; 
} */
type Person = (typeof MyArray)[number];
const p: Person = {
  name: "xiaoqian",
  age: 11,
};

// type Age = number
type Age = (typeof MyArray)[number]["age"];
const age: Age = 11;

// 或者
// type Age2 = number
type Age2 = Person["age"];
const age2: Age2 = 11;

你只能在索引时使用类型,这意味着你不能使用 const 来做一个变量引用:

typescript
const key = "age";
type Age = Person[key];

然而,你可以使用类型别名来实现类似的重构风格:

typescript
type key = "age";
type Age = Person[key];