본문 바로가기

FrontEnd/TypeScript

[TypeScript] 타입별칭(Type Alias) & 인덱스 시그니처(Index Signature)

본 내용은 이정환님의 "한 입 크기로 잘라먹는 타입스크립트" 강의 내용을 바탕으로 작성되었습니다.

 

TypeScript에서 아래 객체리터럴과 같이 타입을 정의하게 되면

let user: {
  id: number;
  name: string;
  birthday: string;
} = {
  id: 1,
  name: "user1",
  birthday: "0000.00.00";
};

let user2: {
  id: number;
  name: string;
  birthday: string;
} = {
  id: 1,
  name: "user1",
  birthday: "0000.00.00";
};

타입에 관한 코드라고 하지만 코드의 중복이 발생하게 됩니다.

이러한 중복을 피하기 위해 타입 별칭(Type Alias)을 사용하면 좋습니다.

 

타입 별칭(Type Alias)type 타입_이름 = 타입 형태로 작성할 수 있습니다.

type User = {
  id: number;
  name: string;
  birthday: string;
}
// 위와 같이 작성하게 되면


let user1: User = {
  id: 1,
  name: "user1",
  birthday: "0000.00.00";
};

let user2: User = {
  id: 2,
  name: "user2",
  birthday: "0000.00.00";
};

타입 별칭(Type Alias)를 사용하게 되면 위와 같이 간단하게 타입을 표현할 수 있습니다.

하지만 타입 별칭(Type Alias)는 동일한 스코프에 동일한 이름으로 선언할 수 없습니다.

type User = {
  id: number;
  name: string;
  birthday: string;
}

type User = {} // ❌ 오류

// 스코프가 다르면 가능
function test() {
  type User = string; // ⭕️
}

 

 

또, 객체의 타입을 유연하게 정의할 수 있도록 돕는 특수한 문법인 인덱스 시그니처(Index Signature)가 있습니다.

type CountryCodes = {
  Korea: string;
  UnitedState: string;
  UnitedKingdom: string;
};

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

이때 많은 양의 프로퍼티(국가 코드)가 추가 되어야 한다면 타입 정의에도 각 프로퍼티를 모두 정의해줘야 하기 때문에 매우 귀찮습니다.

type CountryCodes = {
  Korea: string;
  UnitedState: string;
  UnitedKingdom: string;
  // (... 많은 국가)
  Brazil : string
};

let countryCodes: CountryCodes = {
  Korea: "ko",
  UnitedState: "us",
  UnitedKingdom: "uk",
  // (... 많은 국가)
  Brazil : 'bz'
};

이때 인덱스 시그니처(Index Signature)를 사용하면 매우 간단해집니다.

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

let countryCodes: CountryCodes = {
  Korea: "ko",
  UnitedState: "us",
  UnitedKingdom: "uk",
  // (... 많은 국가)
  Brazil : 'bz'
};

[key : string] : string은 인덱스 시그니처 문법으로 이 객체 타입에는 key가 string 타입이고 value가 string 타입인

모든 프로퍼티를 포함된다 라는 의미입니다.

만약 국가 코드를 숫자로 보관하는 객체가 하나 더 필요하다면 그때 다음과 같은 타입을 정의하면 됩니다.

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

또 이때 반드시 포함해야하는 프로퍼티가 있다면 다음과 같이 직접 명시합니다.

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

한가지 주의할 점은 인덱스 시그니처를 사용하면서 동시에 추가적인 프로퍼티를 또 정의할 때엔 인덱스 시그니처 타입과 직접 추가한

프로퍼티의 value 타입이 호환되거나 일치해야 합니다.

type CountryNumberCodes = {
  [key: string]: number;
  Korea: string; // ❌ 오류!
};

type CountryNumberCodes = {
  [key: string]: number;
  Korea: number; // ⭕️
};

 

 

 

 

 

출처 : https://www.inflearn.com/course/%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8

'FrontEnd > TypeScript' 카테고리의 다른 글

[TypeScript] Enum 타입  (0) 2023.07.21
[TypeScript] 객체  (0) 2023.07.16
[TypeScript] 배열과 튜플  (1) 2023.07.07
[TypeScript] 원시타입과 리터럴타입  (0) 2023.07.07