• [TS] 타입스크립트 유틸리티 타입(Utility types)

    2023. 4. 2.

    by. 지은이: 김지은

    728x90

     

    TypeScript타입 변환을 용이하게 하기 위해 전역으로 사용 가능한 유틸리티 타입을 제공한다.

     

    Partial<T>

    프로퍼티를 선택적으로 구성하여 일부만 사용 가능. 주어진 타입의 하위 타입 집합을 나타내는 타입 반환

    interface User {
        name: string;
        age: number;
    }
    
    let person: Partial<User> = {
        name: 'john'
    }
    
    //Partial<User>는 아래와 같다.
    interface User {
        name: string;
        age?: number;
    }

    Partial<User> 를 사용하면 age 프로퍼티가 없어도 에러가 발생하지 않는다.

     

    Required<T>

    T의 모든 프로퍼티가 필수로 설정된 타입 구성. Partial과 반대

    interface User {
        name: string;
        age?: number; // 선택적 프로퍼티
    }
    
    let person: Required<User> = {
        name: 'john'
    } //Property 'age' is missing in type '{ name: string; }'
    
    // Required<User>는 아래와 같다.
    interface User {
        name: string;
        age: number;
    }

    age는 선택적 프로퍼티이지만 Required로 만들어진 타입은 모든 프로퍼티가 필수로 설정되며 age도 필수 프로퍼티가 되어 에러가 발생한다.

     

    Readonly<T>

    프로퍼티를 읽기 전용으로 설정한 타입 구성.

    interface User {
        name: string;
    }
    
    let person: Readonly<User> = {
        name: 'john'
    }
    
    person.name = 'amy'; //Cannot assign to 'name' because it is a read-only property.ts(2540)

    프로퍼티 생성 후 값 재할당 불가능

     

    Record<K,T>

    Type의 프로퍼티 집합 Keys로 타입 구성. 타입의 프로퍼티들을 다른 타입에 매핑시키는데 사용

    interface PageInfo {
        title: string;
    }
    
    type Page = 'home'|'about'|'contact';
    
    const x: Record<Page, PageInfo> = { // key: Page, Type: PageInfo
        about: {title: 'about'},
        contact: {title: 'contact'},
        home: {subTitle: 'home'}, //Type '{ subTitle: string; }' is not assignable to type 'PageInfo'
        main: {title: 'home'} //main: { title: string; }; }' is not assignable to type 'Record<Page, PageInfo>'.
    }

    가지고 있지 않은 프로퍼티, 타입을 사용하면 에러 발생

    x는 home, about, contact 프로퍼티만 가져야하며 home, about, contact는 title 프로퍼티를 가져야 한다.

     

    Pick<T,K>

    Type의 프로퍼티 Keys의 집합을 선택해 타입 구성

    interface User {
        name: string;
        age: number;
        gender: 'M' | 'W';
    }
    
    type keys = Pick<User, 'name' | 'age'>
    
    let person: keys = {
        name: 'john',
        age: 20,
        gender: 'M' //Type '{ name: string; age: number; gender: string; }' is not assignable to type 'Pick<User, keys>'.
    }

    User에서 선택한 Key 프로퍼티만 추출

     

    Omit<T,K>

    Type의 모든 프로퍼티를 선택 후 Keys를 제거한 타입 구성. Pick 반대

    interface User {
        name: string;
        age: number;
        gender: 'M' | 'W';
    }
    
    type keys = Omit<User, 'gender'>
    
    let person: keys = {
        name: 'john',
        age: 20,
    }

     

    Exclude<T,U>

    T에서 U에 할당할 수 있는 모든 속성을 제외한 타입 구성.

    type T1 = string | number | boolean;
    type T2 = Exclude<T1, number | string>; // boolean

    T1에서 T2를 제외한 타입 구성

     

    Extract<T,U>

    T에서 U에 할당할 수 있는 모든 속성을 추출하여 타입 구성

    type T1 = Extract<"a" | "b" | "c", "a" | "d">; // 'a'
    type T2 = Extract<string | number | (() => void), Function> // () => void

     

    NonNullable<T>

    Null과 Undefined를 제외한 타입

    type T1 = string | null | undefined;
    type T2 = NonNullable<T1>; // string

     

    Parameters<T>

    함수타입 T의 매개변수 타입들의 튜플 타입 구성

    declare function f1(arg: {a: number, b: string}): void
    type T1 = Parameters<() => string>; //[]
    type T2 = Parameters<(s: string) => void>; //[s: string]
    type T3 = Parameters<typeof f1>; // [arg:{a: number, b: string}]

     

    ReturnType<T>

    함수 T의 반환 타입으로 구성된 타입 생성

    declare function f1(): {a: number, b: string}
    type T1 = ReturnType<() => string>; // string
    type T2 = ReturnType<(s: string) => void>; // void
    type T3 = ReturnType<typeof f1>; // {a: number, b: string}

     

    댓글