[TypeScript] 타입스크립트 인덱스 시그니처 (Index Signature)
글 작성자: 망고좋아
반응형
🎯 타입스크립트 인덱스 시그니처 (Index Signature)
📝 자바스크립트 Index Signature
const dog = {
breed: "retriever",
name: "elice",
bark: () => console.log("woof woof"),
};
dog["breed"]; // value의 key인 breed 문자열로 객체의 value 접근 => 'retriever'
- 객체의 특정 value에 접근할 때 그 value의 key를 문자열로 인덱싱해 참조하는 방법
📝 타입스크립트 Index Signature
interface Dictionary<T> {
[key: number]: T;
}
let keys: keyof Dictionary<number>; // 숫자
let value: Dictionary<number>['foo']; // 오류, 프로퍼티 'foo'는 타입 'Dictionary<number>'에 존재하지 않습니다.
let value: Dictionary<number>[42]; // 숫자
// Record<K,T>
interface Dictionary<T> = Record<number, T>
- 자바스크립트의 인덱스 시그니처에 대한 타입을 지정해주는 것
- 보통 객체에 어떤 프로퍼티들이 있는지 명확히 알 수 없을 때 사용한다.
Record<K,T>
로 간편하게 지정해줄 수 있다.- 타입
T
의 프로퍼티의 집합K
로 타입을 구성
- 타입
📝 Index Signature 사용 1 :: 객체의 프로퍼티들을 명확히 알 수 없을 때
type ArrStr = {
[key: string]: string | number;
// [field: string]: string; // Duplicate index signature for type 'string'
[index: number]: string; // 인덱스 시그니처에 number를 넣으면 string 타입 데이터를 참조
length: number; // 일반 프로퍼티와 공존 가능
};
- index 타입은 똑같은 걸 선언해줄 수 없다! ⇒ 하늘 아래 같은 타입의 Index signature는 있을 수 없음
- key가 string인 인덱스 시그니처는 하나만 존재 가능. 한 번 더 정의하려고 하면 타입 에러
- 다른 일반 프로퍼티와 공존 가능
- key는 object 키의 자리를 표시하기 위한 용도
- ArrStr 타입의 데이터를 인덱스 시그니처로 참조할 때 문자열을 넣으면 string 또는 number 타입 데이터 참조한다.
- 인덱스 시그니처에 number를 넣으면 string 값 참조
📝 Index Signature 문제점
type ArrStr = {
[key: string]: string | number;
[index: number]: string;
};
const a: ArrStr = {}; // 타입 선언
a["str"]; // 에러 x
- 타입 선언을 해주면 해당 객체를 프로퍼티로 강제로 할당해야 되는데 그 타입에 인덱스 시그니처로만 이루어져 있으면 빈 객체로 할당해도 타입 에러가 발생하지 않는다.
- 즉, 인덱스 시그니처'만' 사용할 시, 타입을 표시해준 빈 객체에 에러가 나지 않습니다.
- key마다 다른 타입을 가질 수 없음 (key 타입이 string 이면 무조건 string 또는 number 타입)
- 타입에 유연함을 제공하는 대신 키 이름을 잘못 쓴다든지 하는 휴먼 에러를 저지를 가능성
- 따라서 어떤 타입이 올지 알 수 있는 상황이라면 정확한 타입을 정의하여 실수를 방지하는 게 좋다.
- Index signature는 런타임에 객체의 프로퍼티를 알 수 없는 경우에만 사용할 것
반응형
'프로그래밍 > TypeScript' 카테고리의 다른 글
[Typescript] 타입스크립트 non-null 단언 연산자 (Non-null assertion operator) (0) | 2022.06.05 |
---|---|
[TypeScript] 타입스크립트 타입 단언 (Type Assertion) (0) | 2021.11.29 |
[TypeScript] 타입스크립트 함수 오버로딩 : Function Overloading (1) | 2021.11.29 |
[TypeScript] 타입스크립트 null 병합 연산자 (Nullish Coalescing Operator) (1) | 2021.11.29 |
[TypeScript] 타입스크립트 옵셔널 체이닝 (Optional Chaining) (0) | 2021.11.29 |
댓글
이 글 공유하기
다른 글
-
[Typescript] 타입스크립트 non-null 단언 연산자 (Non-null assertion operator)
[Typescript] 타입스크립트 non-null 단언 연산자 (Non-null assertion operator)
2022.06.05 -
[TypeScript] 타입스크립트 타입 단언 (Type Assertion)
[TypeScript] 타입스크립트 타입 단언 (Type Assertion)
2021.11.29 -
[TypeScript] 타입스크립트 함수 오버로딩 : Function Overloading
[TypeScript] 타입스크립트 함수 오버로딩 : Function Overloading
2021.11.29 -
[TypeScript] 타입스크립트 null 병합 연산자 (Nullish Coalescing Operator)
[TypeScript] 타입스크립트 null 병합 연산자 (Nullish Coalescing Operator)
2021.11.29