본문 바로가기
IT/JavaScript & TypeScript

[TypeScript] 유틸리티 타입 (Partial, Required, Record, Pick, Omit, Exclude)

by 저당단 2024. 12. 12.

소개

유틸리티 타입(Utility Types)은 개발자의 편의를 위해 타입스크립트가 제공하는 특수한 타입들이다. 기존의 타입을 조작한 여러가지 유용한 타입을 만들 수 있다.

 

 

상황

타입스크립트를 사용하면서 Interface로 타입을 정의하게 되는데, 어떤 변수를 정의할 때는 일부분의 필드만을 사용하고 싶다.

 

이런 상황이라면, 유틸리티 타입을 고려해볼 수 있다.

 

 

Documentation - Utility Types

Types which are globally included in TypeScript

www.typescriptlang.org

 

 

Partial<Type>, Required<Type>

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

const user: Partial<User> = {
    name: "doringri"
};

 

모든 프로퍼티의 타입을 Optional하게 바꾸는 유틸리티 타입이다.

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

 

즉 Partial<User>는 위의 인터페이스를 새로 정의한 것과 같다.

 

반대로 Required<Type>은 모든 프로퍼티를 required로 바꾼다. Optional한 프로퍼티가 포함된 인터페이스에서 의미가 있다.

 

 

Record<Keys, Type>

const grade: Record<string, number> = {
    math: 90,
    korean: 100
};

객체 형태의 타입을 정의한다.

key와 value의 타입은 위에서 각각 string, number지만 union 타입도 가능하며, 리터럴 타입도 가능하다.

 

type Subject = "math" | "korean";

interface StatisticsInfo {
    sum: number;
    average: number;
}

const grade: Record<Subject, StatisticsInfo> = {
    math: {sum: 200, average: 50},
    korean: {sum: 280, average: 70}
};

즉 이런 것도 가능하다.

 

 

Pick<Type, Keys>, Omit<Type, Keys>

특정 프로퍼티를 이름으로 직접 골라서 새로운 타입을 만든다.

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

const user: Pick<User, "name" | "age"> = {
    name: "doringri",
    age: 10
};

 

반대로 Omit<Type, Keys>는 특정 프로퍼티를 제외한다. 사용법은 Pick과 같다.

 

 

Exclude<T, U>

type Todo = Exclude<"a" | "b" | "c", "b" | "c">;

특정 프로퍼티를 제외한다는 점에서 Omit과 비슷하지만, 사용법이 조금 다르다.

T에는 모든 타입의 목록을, U에는 제외할 타입의 목록을 넣으면 된다.

즉 위의 코드는 "a"라는 프로퍼티만 있는 객체를 정의한 것이다.

 

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

const user: Exclude<keyof User, "hobby"> = {
    name: "doringri",
    age: 10
};

keyof 연산자는 어떤 객체 타입에서 프로퍼티만을 추출하여 타입으로 만든 것이다.

즉 keyof User는 "name" | "age" | "hobby" 와 같다.