[TS] 맵드 타입

TIL

맵드 타입(Mapped Type)은 기존 객체 타입을 기반으로 새로운 객체 타입을 만드는 기능이다.

 

유저 정보를 관리하는 함수들을 작성해보자.

interface User {
  id: number;
  name: string;
  age: number;
}

function fetchUser(): User {
  return {
    id: 1,
    name: "woodstock",
    age: 20,
  };
}

function updateUser(user: User) {
  // 수정 기능
}

 

updateUser 함수로 유저 정보를 수정하려는데, 매개변수 타입이 User여서 수정하고 싶은 프로퍼티만 골라 보낼 수 없다.

 

이 상황을 해결하기 위해 모든 프로퍼티를 선택적으로 만든 새 타입을 정의해보자.

type PartialUser = {
  id?: number;
  name?: string;
  age?: number;
};

function updateUser(user: PartialUser) {
  // 수정 기능
}

하지만 이럴 경우 User와 PartialUser가 중복된 프로퍼티를 정의하고 있어 좋지 않다.

 

맵드 타입을 사용하면 이 문제를 해결할 수 있다.

interface User {
  id: number;
  name: string;
  skill: string;
}

type PartialUser = {
  [key in "id" | "name" | "skill"]?: User[key];
};

function updateUser(user: PartialUser) {
  // 수정 기능
}

updateUser({
  skill: "TypeScript",
});

[key in "id" | "name" | "skill"]는 각 키를 순회하며 새로운 타입을 만든다. User[key]는 인덱스드 액세스 타입으로 해당 프로퍼티의 타입을 가져온다.

 

keyof와 함께 사용

맵드 타입은 keyof 연산자와 함께 사용할 수 있다.

type PartialUser = {
  [key in keyof User]?: User[key];
};

 

모든 프로퍼티의 타입을 변환하는 것도 가능하다.

type BooleanUser = {
  [key in keyof User]: boolean;
};

 

읽기 전용 타입 만들기

모든 프로퍼티를 읽기 전용으로 만들 수도 있다.

type ReadonlyUser = {
  readonly [key in keyof User]: User[key];
};

 

주의사항

맵드 타입은 타입 별칭에서만 사용할 수 있다. 인터페이스에서는 사용할 수 없다.

'TIL' 카테고리의 다른 글

[TS] 타입 조작 및 고급 타입 활용 연습  (0) 2025.11.05
[TS] 템플릿 리터럴 타입  (0) 2025.11.05
[TS] keyof와 typeof 연산자  (0) 2025.11.05
[TS] 인덱스드 액세스 타입  (0) 2025.11.05
[CS50] 컴퓨팅 사고 - 알고리즘  (0) 2025.11.05
'TIL' 카테고리의 다른 글
  • [TS] 타입 조작 및 고급 타입 활용 연습
  • [TS] 템플릿 리터럴 타입
  • [TS] keyof와 typeof 연산자
  • [TS] 인덱스드 액세스 타입
고견
고견
개발 자국 남기기
  • 고견
    개발자국
    고견
  • 전체
    오늘
    어제
    • 분류 전체보기 (157) N
      • Frontend (29)
        • Next.js (16)
        • JavaScript (7)
      • CS (19) N
        • 자료구조 (9)
        • 알고리즘 (5)
        • 운영체제 (4) N
        • 네트워크 (1) N
      • TIL (93)
      • Dev Log (16)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    CS
    바닐라 자바스크립트
    페이지 라우터
    typescript
    Pages Router
    memory
    useState
    algorithm
    generic
    react
    Trouble Shooting
    C
    Spa
    트러블 슈팅
    클래스
    Next.js
    앱 라우터
    App Router
    인터페이스
    제네릭
    emotion diary
    알고리즘
    타입 좁히기
    ai 감성 일기장
    javascript
    함수 타입
    자료구조
    문자열
    배열
    cs50
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
고견
[TS] 맵드 타입
상단으로

티스토리툴바