본문 바로가기
Frontend/TypeScript

[TypeScript] TypeScript 유틸리티 타입 - 6

by 신림쥐 2024. 4. 19.
728x90

 

     


    유틸리티 타입?

    - 지금까지의 타입 조작기능 (제너릭, 맵드, 조건부 타입 등)을 이용해 실무에서 자주 사용되는 유용한 타입을 모아놓은 기능

    - https://www.typescriptlang.org/docs/handbook/utility-types.html

     

    Documentation - Utility Types

    Types which are globally included in TypeScript

    www.typescriptlang.org

     

     

    맵드 타입 기반

    Partial

    - 특정 객체 타입의 모든 프로터티를 선택적 프로퍼티로 바꿔주는 타입

    // Partial<T>
    interface Post {
        title: string;
        tags: string[];
        content: string;
        thumbnailURL?: string;
    }
    
    // const draft: Post = { // error -  tags 프로퍼티가 없음
    //   title: "제목은 나중에 짓자...",
    //   content: "초안...",
    // };
    
    const draft: Partial<Post> = {
        title: "제목 나중에 짓자",
        content: "초안...",
      };

     

     

    Required

    - 특정 객체 타입의 모든 프로퍼티를 필수 프로퍼티로 변환

    // Required<T>
    interface Post {
        title: string;
        tags: string[];
        content: string;
        thumbnailURL?: string;
    }
    
    // const withThumbnailPost: Post = { // 오류는 나지 않지만 모든 프로퍼티를 필수로 하고 싶은 경우
    //     title: "한입 타스 후기",
    //     tags: ["ts"],
    //     content: "",
    //     thumbnailURL: "https://...",
    // };
    const withThumbnailPost: Required<Post> = {
        title: "한입 타스 후기",
        tags: ["ts"],
        content: "",
        thumbnailURL: "https://...",
    };

     

    Readonly

    - 모든 프로퍼티를 읽기 전용 프로퍼티로 변환

    // Readonly<T> 
    interface Post {
        title: string;
        tags: string[];
        content: string;
        thumbnailURL?: string;
    }
    
    // Readonly<T> 
    const readonlyPost: Readonly<Post> = {
        title: "보호된 게시글입니다.",
        tags: [],
        content: "",
    };
    // readonlyPost.content = '해킹당함'; // error - 수정 방지 프로퍼티

     

    Pick

    - 특정 객체 타입으로부터 특정 프로퍼티 만을 골라내는 그런 타입

    // Pick<T, K>
    interface Post {
        title: string;
        tags: string[];
        content: string;
        thumbnailURL?: string;
    }
    // const legacyPost: Post = { // error - tag가 없어서 오류 발생
    //     title: "",
    //     content: "",
    // };
    const legacyPost: Pick<Post, "title" | "content"> = {
        title: "",
        content: "",
    };

    Omit

    - 특정 객체 타입으로부터 특정 프로퍼티 만을 제거하는 타입

    // Omit<T, K>
    interface Post {
        title: string;
        tags: string[];
        content: string;
        thumbnailURL?: string;
    }
    // const noTitlePost: Post = { // error - title이 없어서
    //     content: "",
    //     tags: [],
    //     thumbnailURL: "",
    // };
    const noTitlePost: Omit<Post, "title"> = {
        content: "",
        tags: [],
        thumbnailURL: "",
    };

    Record

    - 똑같이 생긴 프로퍼티가 계속해서 중복코드가 발생할때 지정하는 타입

    // Record<K, V>
    type ThumbnailLegacy = {
        large: {
            url: string;
        };
        medium: {
            url: string;
        };
        small: {
            url: string;
        };
    };
    type Thumbnail = Record<"large" | "medium" | "small", { url: string }>;

     

     

    조건부 타입 기반

    Exclude

    - T로부터 U를 제거하는 타입

    // Exclude
    type A = Exclude<string | boolean, string>; // // boolean

    Exreact

    - T로 부터 U를 추출하는 타입

    // Exreact
    type B = Extract<string | boolean, boolean>; // boolean

    ReturnType

    - T에 할당된 함수 타입의 반환값 타입을 추출하는 타입

    // ReturnType
    function funcA() {
        return "hello";
    }
    function funcB() {
        return 10;
    }
    
    type ReturnA = ReturnType<typeof funcA>; // string
    type ReturnB = ReturnType<typeof funcB>; // number

     

     

    출처

    • 한 입 크기로 잘라먹는 타입스크립트(TypeScript)
    728x90