타입스크립트는 모든 키를 미리 정의할 수 없을 때 동적 속성 이름을 가진 객체를 설명할 수 있도록 해줍니다. 이를 위해 색인 서명이 사용되며, 이는 가변 객체(맵, 외부 서버로부터의 데이터 등)에 대한 타입을 지정하는 방법으로 등장하였습니다.
색인 서명이 없으면 객체는 미리 정해진 키만 인식하며, 다른 키가 있을 경우 컴파일 오류가 발생합니다. 이와 함께 잘못된 서명 선언은 객체의 모든 속성 타입을 흐리게 하고, 타입의 엄격성을 감소시켜 버그를 유발할 수 있습니다.
정당한 경우에만 색인 서명을 명시적으로 선언하십시오. 문자열 키에 대한 객체 배열을 타입 지정하려면 다음 형식을 사용하세요:
코드 예시:
interface Dictionary { [key: string]: number; length?: number; } const sample: Dictionary = { apples: 4, oranges: 10 }; sample['bananas'] = 6;
주요 특징:
색인 서명에서 서로 다른 키에 대해 서로 다른 값 타입을 지정할 수 있나요?
아니요, 타입은 모든 키 집합에 대해 동일하게 적용됩니다. 만약 [key: string]: number 라고 지정하면 sample.length 도 number 이어야 하며, 이는 종종 색인 서명과 알려진 속성의 공동 사용 시 오류를 일으킵니다.
색인 서명을 심볼(symbol)과 함께 사용할 수 있나요?
예, ES6부터 타입스크립트는 심볼에 대한 색인 서명을 지원합니다:
interface SymbolMap { [key: symbol]: string; }
색인 서명이 있는 객체를 다른 타입의 추가 속성과 함께 선언하면 어떻게 되나요?
타입이 명시된 색인 서명의 값 타입과 호환되지 않으면 컴파일러가 오류를 발생시킵니다. 이를 union 타입을 사용하거나 해당 필드를 별도의 인터페이스로 분리하여 우회할 수 있습니다.
서버의 모든 응답에 대해 {[key: string]: any} 인터페이스가 사용되었고, 이로 인해 데이터 구조에 대한 통제력을 잃어버리고 치명적인 버그가 발생했습니다.
장점:
단점:
컬렉션(예: 키에 대한 구성을 위한)으로 색인 서명을 엄격하게 사용하며, 알려진 속성은 서명 외부에서 그 타입을 명시적으로 선언합니다.
장점:
단점: