IT/JavaScript & TypeScript

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

땅일단 2024. 12. 12. 23:48

소개

유틸리티 타입(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" 와 같다.