Javascript

타입스크립트 유틸리티 타입

브라더 코드 2023. 4. 14. 21:12
타입스크립트는 유용한 유틸리티 타입이 많다.
공부하고 숙지해두자. 아는만큼 개발에 쓰일 것이다.
 
/** 1. keyof : interface의 key값들을 유니언 형태로 뽑아냄 */
interface User {
  id: number;
  name: string;
  age: number;
  gender: 'm' | 'f';
}

type UserKey = keyof User;
// UserKey : 'id | name | age | gender';

const uk: UserKey = 'gender';

/** 2. Partial<T> : property를 optional로 만듬 */
let admin: Partial<User> = {
  id: 1,
  name: 'Bob',
}

/** 3. Required<T> : 모든 property를 필수로 만듬 */
interface Animal {
  id: number;
  name: string;
  age?: number;
}

// 아래처럼 쓰면 에러 발생함
let cat: Required<Animal> = {
  id: 1,
  name: 'Bob',
}

/** 4. Readonly<T> : 처음 할당만 가능하고 뒤에 수정 불가능 */
interface Sports {
  id: number;
  players?: number;
}

let Soccer: Readonly<Sports> = {
  id: 1,
  players: 11,
}

Soccer.players = 4;

/** 5. Record<K,T> */
type Grade = '1' | '2' | '3' | '4';
type Score = 'A' | 'B' | 'C' | 'D';

const score: Record<Grade, Score> = {
  1: 'A',
  2: 'C',
  3: 'B',
  4: 'D',
}

interface UserPerson {
  id: number;
  name: string;
  age: number;
}

function isValid(user: UserPerson) {
  const result: Record<keyof UserPerson, boolean> = {
    id: user.id > 0,
    name: user.name !== '',
    age: user.age > 0,
  };
  return result;
}

/** 6. Pick<T,K> : T타입에서 K프로퍼티만 골라서 사용 */
interface Person {
  id: number;
  name: string;
  age: number;
  gender: 'M' | 'W';
}

let adminPerson: Pick<Person, 'id' | 'name'> = {
  id: 1,
  name: 'kim',
}

/** 7. Omit<T,K> : Pick과 반대 */
let adminPerson2: Omit<Person, 'id' | 'name'> = {
  age: 10,
  gender: 'W',
}

/** 8. Exclude<T1,T2> : 타입T1에서 T2를 제외하고 사용 */
type T1 = string | number | boolean;
type T2 = Exclude<T1, number | string>;

/** 9. NonNullable<Type> : null, undefined를 제외한 타입을 사용 */
type Type1 = string | null | undefined | boolean;
type Type2 = NonNullable<Type1>;