索引访问类型

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

¥We can use an indexed access type to look up a specific property on another type:

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

索引类型本身就是一种类型,所以我们可以完全使用联合、keyof 或其他类型:

¥The indexing type is itself a type, so we can use unions, keyof, or other types entirely:

ts
type I1 = Person["age" | "name"];
type I1 = string | number
 
type I2 = Person[keyof Person];
type I2 = string | number | boolean
 
type AliveOrName = "alive" | "name";
type I3 = Person[AliveOrName];
type I3 = string | boolean
Try

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

¥You’ll even see an error if you try to index a property that doesn’t exist:

ts
type I1 = Person["alve"];
Property 'alve' does not exist on type 'Person'.2339Property 'alve' does not exist on type 'Person'.
Try

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

¥Another example of indexing with an arbitrary type is using number to get the type of an array’s elements. We can combine this with typeof to conveniently capture the element type of an array literal:

ts
const MyArray = [
{ name: "Alice", age: 15 },
{ name: "Bob", age: 23 },
{ name: "Eve", age: 38 },
];
 
type Person = typeof MyArray[number];
type Person = { name: string; age: number; }
type Age = typeof MyArray[number]["age"];
type Age = number
// Or
type Age2 = Person["age"];
type Age2 = number
Try

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

¥You can only use types when indexing, meaning you can’t use a const to make a variable reference:

ts
const key = "age";
type Age = Person[key];
Type 'key' cannot be used as an index type.
'key' refers to a value, but is being used as a type here. Did you mean 'typeof key'?
2538
2749
Type 'key' cannot be used as an index type.
'key' refers to a value, but is being used as a type here. Did you mean 'typeof key'?
Try

但是,你可以将类型别名用于类似样式的重构:

¥However, you can use a type alias for a similar style of refactor:

ts
type key = "age";
type Age = Person[key];
Try