타입 별칭과 인덱스 시그니쳐

woodstock·2023년 12월 7일
0
post-thumbnail

타입 별칭과 인덱스 시그니쳐

타입 별칭(Type Alias)

타입 별칭을 이용하면 다음과 같이 변수를 선언하듯 타입을 별도로 정의할 수 있다.

type User = {
  id: number;
  name: string;
  nickname: string;
  mbti: string;
};
let user1: User = {
  id: 1,
  name: "woodstock",
  nickname: "woody",
  mbti: "ESTJ",
};

let user2: User = {
  id: 1,
  name: "coco",
  nickname: "wawa",
  mbti: "INFJ",
};

참고로 동일한 스코프에 동일한 이름의 타입 별칭을 선언하는 것을 불가능 하다.

그러나 스코프가 다르다면 아래와 같이 중복된 이름으로 여러개의 별칭을 선언해도 상관없다.


인덱스 시그니처(Index Signature)

인덱스 시그니처는 객체 타입을 유연하게 정의할 수 있도록 돕는 특수한 문법이다.

type CountryCodes = {
  [key: string]: string;
};

let countryCodes: CountryCodes = {
  Korea: "ko",
  UnitedState: "us",
  UnitedKingdom: "uk",
};

인덱스 시그니처는 규칙을 위반하지만 않으면 모든 객체를 허용하기 때문에 아래와 같이 빈 객체에서도 오류를 발생시키지는 않는다.

type CountryNumberCodes = {
  [key: string]: number;
};

let countryNumberCodes: CountryNumberCodes = {};

또한, 반드시 포함해야 하는 프로퍼티가 있다면 다음과 같이 직접 명시해도 된다.

type CountryNumberCodes = {
  [key: string]: number;
  Korea: number; // 필수 프로퍼티
};



한 가지 주의할 점은,
인덱스 시그니처를 사용하면서 동시에 추가적인 프로퍼티를 또 정의할 떄에는 인덱스 시그니처의 value타입과 직접 추가한 프로퍼티의 value타입이 호환되거나 일치해야 한다.

따라서, 다음과 같이 서로 호환되지 않는 타입으로 설정하면 오류가 발생한다.

type CountryNumberCodes = {
  [key: string]: number;
  Korea: string; // 에러
};

let countryNumberCodes: CountryNumberCodes = {
  Korea: "kr", // 에러
};

profile
해내는 사람

0개의 댓글