우리는 다른 타입에 있는 특정 프로퍼티를 탐색하기 위해 *인덱스드 억세스 타입(indexed access type)*을 사용할 수 있다.

-indexed-access-type-basic.ts-

type Person = { age: number; name: string; alive: boolean };
type Age = **Person['age'];**
// type Age = number

인덱싱 타입은 그 자체로 타입이다. 따라서 우리는 유니온 혹은 keyof 등 다른 타입 전체를 사용할 수 있다.

-indexed-access-type-entirely.ts-

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

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

만약 존재하지 않는 프로퍼티를 인덱스 처리하려 하면 다음과 같은 에러를 볼 수 있다.

type I1 = Person['alve'];
// Property 'alve' does not exist on type 'Person'.

아래의 예제는 배열의 요소 타입을 알아내기 위해 number를 사용한다. 이 number는 인덱싱에 사용할 타입을 지정하는 동시에 임의의 숫자를 의미한다. 우리는 배열 리터럴의 요소 타입을 캡쳐하기 위해 "typeof" 와 "number를 통한 요소 접근 방법"을 조합할 수 있다.

-indexed-access-type-array.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

// 또는

type Age2 = Person['age'];
// type Age2 = number

인덱싱할 때 당신은 오직 타입만 사용할 수 있다. 이는 let, const 등으로 만든 변수, 상수로 인덱싱 처리를 할수는 없다는 것이다.

const key = 'age';
type Age = Person[key];
// Type 'any' 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'?

한편 다음처럼 타입 앨리어스로 리팩토링하여 유사한 효과를 낼 수 있다.

type key = 'age';
type Age = Person[key];