Indexed Access Types (인덱스 접근 타입)은 특정 객체의 속성 타입이나 모든 키에 대해 T[K] 구문을 통해 참조할 수 있게 해줍니다. 이는 유연하고 타입 안전한 추상화를 만들기 위한 강력한 도구입니다.
type Person = { name: string; age: number; }; type NameType = Person['name']; // string type AgeOrName = Person['age' | 'name']; // number | string
유니버설 타입 및 함수 작성을 위해 사용됩니다:
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] { return obj[key]; // 올바른 반환 타입 } const user = { email: 'a@a.ru', id: 1 }; let id = getProperty(user, 'id'); // id: number
Person['salary'] — 컴파일 단계의 오류.질문: 표현식 type Foo = {a: number, b: string}["a" | "b" | "c"]의 타입은 무엇인가요?
답변: 이 예제는 'c'가 접근하고자 하는 타입의 키가 아니므로 컴파일 오류를 발생시킵니다. TypeScript는 다음과 같은 오류를 반환합니다:
Type '"c"' does not satisfy the constraint '"a" | "b"'.
이야기
프로젝트에서 타입에 기반하여 동적으로 폼을 생성했습니다. 기본 타입에 새로운 필드를 추가한 후, 키 인덱싱 위치를 업데이트하지 않아 일부 속성이 폼에 포함되지 않았고, 타입 레벨에서는 전체 매핑이 예상되었습니다. 오류는 런타임에서만 발생했으며 개발 단계에서는 나타나지 않았습니다.
이야기
데이터 검증 라이브러리에서 인덱스 접근 타입을 사용했으나 코드 마이그레이션 중 하나의 키를 객체에서 부모로 이동했습니다. 이전의 인덱스 타입은 컴파일 오류를 초래했지만, 오류는 CI의 캐시로 인해 재빌드 후에만 발생했고, 그 전에 몇 주 동안 스테이징에서 살아있었습니다.
이야기
Indexed Access Types를 사용하면 명시적으로 나열되지 않은 키에도 접근할 수 있다고 잘못 생각하여, 동적 속성을 위한 자동 테스트의 잘못된 생성을 초래했습니다. 결과적으로 컴파일러가 이러한 경우를 유효하지 않다고 처리하여 일부 가능한 시나리오를 테스트하지 않았습니다.