<aside> 🔥 이번 시간에는 타입스크립트의 다양한 유틸리티 타입에 대해 알아보았다.

</aside>

  1. keyof

    interface의 키값만 가져올 수 있다.

    // keyof
    
    interface User {
      id:number;
      name:string;
      age:number;
      gender: "m" | "f"
    }
    
    type UserKey = keyof User; // id | name | age | gender
    
    const uk:UserKey = "id"
    
  2. Partial<T>

    모든 프로퍼티를 optional로 바꿔준다.

    // Partial<T>
    
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "m" | "f";
    }
    
    let admin: Partial<User> = {
      id: 1,
      name: "chul",
    };
    
  3. required<T>

    모든 프로퍼티를 필수로 바꿔준다.

    // Required<T>
    
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "m" | "f";
    }
    
    // 모든 프로퍼티가 필수이기 때문에 오류
    let admin: Required<User> = {
      id: 1,
      name: "chul",
    };
    
  4. Readonly<T>

    // Readonly<T>
    
    interface User {
      id: number;
      name: string;
      age?: number;
    }
    
    // 모든 프로퍼티가 필수이기 때문에 오류
    let admin: Readonly<User> = {
      id: 1,
      name: "chul",
    };
    
    // 할당만 가능하고 이후 수정 불가.
    admin.id = 4;
    
  5. Record<K, T>

    // Record<K,T>
    K : Key
    T : Type
    
    // 이런식으로 작성하는 것을
    interface Score {
      "1": "A" | "B" | "C" | "D";
      "2": "A" | "B" | "C" | "D";
      "3": "A" | "B" | "C" | "D";
      "4": "A" | "B" | "C" | "D";
    }
    const score = {
      1: "A",
      2: "B",
      3: "C",
      4: "D",
    };
    
    // 이런식으로
    const score: Record<"1" | "2" | "3" | "4", "A" | "B" | "C" | "D"> = {
      1: "A",
      2: "B",
      3: "C",
      4: "D",
    };
    
    // 혹은 이런식으로
    // Record<K,T>
    
    type Grade = "1" | "2" | "3" | "4";
    type Score = "A" | "B" | "C" | "D";
    
    const score: Record<Grade, Score> = {
      1: "A",
      2: "B",
      3: "C",
      4: "D",
    };
    
  6. keyof 와 Record 활용

    interface User {
      id: number;
      name: string;
      age: number;
    }
    
    function isValid(user: User) {
      const result: Record<keyof User, boolean> = {
        id: user.id > 0,
        name: user.name !== "",
        age: user.age > 0,
      };
      return result;
    }
    
  7. Pick<T, K>

    아래와같이 특정 키만 가져와서 사용 가능.

    // Pick<T,K>
    
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "M" | "W";
    }
    
    const admin: Pick<User, "id" | "name"> = {
      id: 0,
      name: "bob",
    };
    
  8. Omit<T, K>

    특정 프로퍼티를 생략하고 사용 가능

    // Omit<T,K>
    
    interface User {
      id: number;
      name: string;
      age: number;
      gender: "M" | "W";
    }
    
    const admin: Omit<User, "age" | "gender"> = {
      id: 0,
      name: "bob",
    };
    
  9. Exclude<T1, T2>

    // Exclude <T1, T2>
    // 타입1에서 타입2를 제외하고 사용
    // Omit은 property를 제거
    // Exclude는 type을 제거
    
    type T1 = string | number;
    type T2 = Exclude<T1, number>; // T1 에서 number 제거
    
  10. NonNullable<Type>

    // NonNullabe<Type>
    
    type T1 = string | null | undefined | void;
    type T2 = NonNullable<T1>
    // T1에서 null만 뺀 타입