dev.syw

Partial·Pick·Omit·Record 등 내장 유틸리티 타입과 keyof·typeof·인덱스 접근 타입을 다룬다.

유틸리티 타입

이미 있는 타입을 변형해 새 타입을 만들어야 할 때가 많습니다. TypeScript는 자주 쓰는 변형을 유틸리티 타입으로 기본 제공합니다. 직접 만들지 않아도 됩니다.

학습 목표

  • Partial/Required/Readonly 로 프로퍼티 성질을 바꾼다.
  • Pick/Omit 으로 일부 프로퍼티만 고른다.
  • Record 로 키-값 맵 타입을 만든다.
  • keyof/typeof/인덱스 접근 타입을 활용한다.

예제용 기본 타입

아래 유틸리티들을 이 타입에 적용해 보겠습니다.

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

Partial — 모두 선택적으로

모든 프로퍼티를 선택적(?)으로 만듭니다. 일부만 업데이트하는 함수에 유용합니다.

function updateUser(id: number, changes: Partial<User>) {
  // changes는 { id?, name?, email? }
}

updateUser(1, { name: '새이름' }); // 일부만 넘겨도 OK

Required — 모두 필수로

Partial 의 반대. 모든 프로퍼티를 필수로 만듭니다.

type FullUser = Required<User>; // 모든 필드 필수

Readonly — 모두 읽기 전용으로

모든 프로퍼티를 readonly 로 만듭니다.

const config: Readonly<User> = { id: 1, name: '민수', email: 'a@b.com' };
config.name = '영희'; // ❌ 읽기 전용

Pick — 일부만 고르기

특정 프로퍼티만 골라 새 타입을 만듭니다.

type UserPreview = Pick<User, 'id' | 'name'>;
// { id: number; name: string }

Omit — 일부만 제외하기

Pick 의 반대. 특정 프로퍼티를 빼고 나머지를 가져옵니다.

type UserWithoutEmail = Omit<User, 'email'>;
// { id: number; name: string }
유틸리티효과
Partial<T>모든 프로퍼티 선택적
Required<T>모든 프로퍼티 필수
Readonly<T>모든 프로퍼티 읽기 전용
Pick<T, K>K에 해당하는 프로퍼티만
Omit<T, K>K를 제외한 나머지

Record — 키-값 맵

키 타입과 값 타입으로 객체 타입을 만듭니다.

type Role = 'admin' | 'user' | 'guest';
type Permissions = Record<Role, boolean>;

const perms: Permissions = {
  admin: true,
  user: true,
  guest: false,
};

ReturnType — 함수의 반환 타입

함수 타입에서 반환 타입을 뽑아냅니다.

function createUser() {
  return { id: 1, name: '민수' };
}

type NewUser = ReturnType<typeof createUser>;
// { id: number; name: string }

keyof — 키들의 유니온

객체 타입의 키를 리터럴 유니온으로 가져옵니다.

type UserKeys = keyof User; // 'id' | 'name' | 'email'

typeof — 값에서 타입 뽑기

typeof 를 타입 자리에서 쓰면 값의 타입을 얻습니다. 이미 만든 객체에 맞춰 타입을 정의할 때 편합니다.

const defaultSettings = {
  theme: 'dark',
  fontSize: 14,
};

type Settings = typeof defaultSettings;
// { theme: string; fontSize: number }

💡 TIPkeyof typeof obj 조합은 자주 쓰입니다. 값으로 만든 객체에서 키 유니온을 뽑을 때 keyof typeof defaultSettings'theme' | 'fontSize'.

인덱스 접근 타입

T[K] 로 타입 안의 특정 프로퍼티 타입을 꺼냅니다.

type EmailType = User['email'];          // string
type IdOrName = User['id' | 'name'];     // number | string

요약

  • Partial/Required/Readonly 는 프로퍼티의 성질을 일괄 변경한다.
  • Pick/Omit 은 프로퍼티를 고르거나 제외한다.
  • Record<K, V> 는 키-값 맵 타입을 만든다.
  • keyof, typeof, T[K] 를 조합하면 기존 타입에서 새 타입을 유연하게 끌어낼 수 있다.

댓글 0

TypeScript” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.