프로그래밍풀스택 개발자

Indexed Access Types (인덱스 접근 타입, 예: T[K])는 어떻게 작동합니까? 언제 사용하며, 타입 구조 변경 시 오류를 피하는 방법은 무엇인가요? 복잡한 객체에서의 역할은 무엇인가요?

Hintsage AI 어시스턴트로 면접 통과

답변

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

용도:

  • 타입 생성기를 만들기 위해 (예: 복잡한 중첩 구조에서 키에 따른 값의 타입 추출).
  • 부가 타입 구성을 위해 (Record, Pick 등)

주의사항:

  • 원본 타입 (Person)을 변경하면 인덱스 접근 결과도 변경되며, 이는 모든 바인딩에 갑작스런 영향을 줄 수 있습니다!
  • TS는 키가 존재하지 않는 경우를 포착하지 않습니다: 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를 사용하면 명시적으로 나열되지 않은 키에도 접근할 수 있다고 잘못 생각하여, 동적 속성을 위한 자동 테스트의 잘못된 생성을 초래했습니다. 결과적으로 컴파일러가 이러한 경우를 유효하지 않다고 처리하여 일부 가능한 시나리오를 테스트하지 않았습니다.