본문 바로가기
프로그래밍 개발/Typescript

Typescript 맵드 타입(mapped type)

by Jinseok Kim 2021. 5. 10.
반응형

맵드 타입(mapped type)

 

기본문법

type T1 = { [K in 'prop1' | 'prop2']: boolean };
  • 맵드 타입으로 만들어지는 것은 객체이기 때문에 중괄호로 감싸있다.
  • 그리고 중괄호 안에 대괄호가 있는데 대괄호안에는 key 부분을 나타내는 것이며 in라는 키워드가 맵드 타입을 정의해준다.
  • 즉 위의 코드르 보면 in 뒤에 붙어있는 union 문자열이 타입의 key로서 속성으로 boolean이라는 타입을 각각 정의받게 된다.
  • 마치 함수를 사용하는 것처럼 이용 가능하다.

 

 

 

 

입력된 인터페이스의 모든 속성 바꾸기

interface Person {
    name: string;
    age: number;
}

type MakeBoolean<T> = { [P in keyof T]?: boolean};
const pMap: MakeBoolean<Person> = {};
pMap.name = true; //통과
pMap.age = false; //통과
  • 위와같이 맵드 타입을 이용하면 Person의 인터페이스의 키와 타입 값들의 속성을 바꿀 수 있다.
  • Person의 인터페이스가 T로 재네릭으로 들어가 선택 타입boolean을 받아 속성이 변화된 것을 눈치 챌 수 있다.

 

 

interface Person {
    name: string;
    age: number;
}

type T1 = Person['name'];

type Readonly<T> = { readonly[P in keyof T]: T[P]};
type Partial<T> = { [P in keyof T]?: boolean};

type T2 = Partial<Person>
type T3 = Readonly<Person>
  • 맵드 타입 문법을 이용하여 readonly 키워드를 붙여주는 것과 선택 타입과 boolean 타입을 붙여주는 것으로 각각 부여해주었다.
  • 이때 T[P]라는 의미는 Person이 만약 재네릭으로 T로서 들어가게 된다면 Person 인터페이스의 타입 값을 의미한다고 보면 된다. 즉 Person의 타입 값들을 그대로 타입 값으로 설정한다는 뜻이다. P는 타입 값을 가르키기 위한 키 값이라고 보면 된다.
  • 즉 바뀌는 것을 readonly선택 타입 ' ? '을 붙여주는 것 뿐이라고 볼 수 있다.

 

 

 

 

Pick 맵드 타입

type Pick<T, K extends keyof T> = { [P in K]: T[P] }; //생략 가능

interface Person {
    name: string;
    age: number;
    language: string;
}

type T1 = Pick<Person, 'name' | 'language'>;
  • 재네릭과 함께 사용한 맵드 타입의 활용한 코드인데 Pick 라는 기능을 보여주고 있다.
  • 재네릭에서 Person의 인터페이스를 T로 받아와 K extends keyof T 라는 키워드를 사용하여 K가 T에 할당받도록 하였다.
  • 이때 K는 꼭 T에 할당 되도록 T인 Person의 키 이름 중에 포함되어 있거나 키 이름이 딱 들어맞아야 하는 조건이 생긴다.
  • 그리고 바로 맵드 타입을 이용하여 [P in K]의 의미는 T(Person)로 할당 해줄 K을 맵드 타입의 키 이름으로 지정하고 T[P]을 이용하여 그대로 Person 인터페이스의 속성 값 그대로 사용한다는 코드로 해석할 수 있다.
  • Pick은 타입스크립트 내장 기능이기에 type Pick<T, K extends keyof T> = { [P in K]: T[P] };이 생략 가능하다.

 

 

 

Record 맵드 타입

interface Person {
    name: string;
    age: number;
    language: string;
}

type Record<K extends string, T> = { [P in K]: T }; //생략 가능
type T1 = Record<'p1' | 'p2', Person>;
type T2 = Record<'p1' | 'p2', number>;
  • 위의 코드를 보면 <K extends string, T> 의미는 문자열로 이루어진 K와 T을 받는다고 보면 되고 [P in K]는 K 속성으로 이루어진 인터페이스를 이루게 해준다고 볼 수 있다. 값의 타입은 T에 들어오는 인터페이스 자체로 설정하였다.
  • 문자열인 p1, p2로 인터페이스의 키 이름으로 하고 타입 값을 Person 인터페이스로 한다는 의미이다.
  • const T1 = { p1: Person; p2: Person; } 이렇게 만들어 진다.
  • 이때 Record는 타입스크립트 내장 기능이기에  type Record<K extends string, T> = { [P in K]: T }; 생략 가능

 

 

 

enum과의 맵드 타입 활용

enum Fruit {
    Apple,
    Banana,
    Orange,
}

const FRUIT_PRICE: { [key in Fruit]: number } = {
    [Fruit.Apple]: 1000,
    [Fruit.Banana]: 1500,
    [Fruit.Orange]: 1500,
};
  • 위의 코드처럼 enum을 이용하면 맵드 타입과 함께 사용할 수 있다.
  • Fruit enum을 이용하여 키 이름으로 지저하고 number 타입으로 모두 지정해주었다.
  • [key in Fruit]을 해주었기에 이때 Fruit enum에 있는 과일이 하나라도 빠지면 안된다. 또 새로운 것이 Fruit enum에 추가되어도 오류가 등장한다.

 

 

 

반응형

'프로그래밍 개발 > Typescript' 카테고리의 다른 글

Typescript 타입 추론  (0) 2021.05.11
Typescript 조건부 타입  (0) 2021.05.10
Typescript 재네릭  (0) 2021.05.07
Typescript 타입 호환성  (0) 2021.05.07
Typescript 인터페이스(Interface)  (0) 2021.05.06

댓글