TypeScript : enum과 object literal 비교 & 유틸리티 타입

728x90
반응형

* enum : 간단한 상수 값

* object literal : 복잡한 구조 + 다양한 데이터 타입 

 

1. enum

- 열겨형 데이터 타입

- 상수의 그룹화에 적합

- 간단한 상수값 --> 각 멤버의 값이 변하면 안된다는 조건이 있음

2. object literal

- 키 +값으로 구성된 객체

- [1,3,4],'k',7 의 값으로 바인딩 가능 --> number와 string 타입의 값만 대입 가능

- 복잡한 구조와 다양한 데이터 타입을 사용할 때 (맘대로 변경 가능)

3. 유틸리티 타입

(1) Partial<T>

- 일부 속성만 제공하는 객체 생성 가능

interface Person {
  name: string;
  age: number;
}

const updatePerson = (person: Person, fields: Partial<Person>): Person => {
  return { ...person, ...fields };
};

const person: Person = { name: "Spartan", age: 30 };
const changedPerson = updatePerson(person, { age: 31 });

- name, age 하나씩 있어도 되고, 둘다 있어도 됨 (이 밖의 상황은 허용 안함 : gender 같은 기존에 없는 속성)

 

 

(2) Required<T>

- 모든 속성이 반드시 전부 제공

interface Person {
  name: string;
  age: number;
  address?: string; // 속성 명 뒤에 붙는 ?가 뭘까요
}

- 변수 이름에 물음표 : 선택적 속성 => 있어도 없어도 되는 친구

- address는 필수여야해! 한다면=> ?를 지울 수 없으니까 (다른 코드에서는 어떻게 사용될지 모르니)

type RequiredPerson = Required<Person>;

- address를 강제로 필수선택으로 사용 가능

 

 

(3) ReadOnly<T>

- 완변한 불변 객체로 취급 가능

- 객체의 상수화!

interface DatabaseConfig {
  host: string;
  readonly port: number; // 인터페이스에서도 readonly 타입 사용 가능해요!
}

const mutableConfig: DatabaseConfig = {
  host: "localhost",
  port: 3306,
};

const immutableConfig: Readonly<DatabaseConfig> = {
  host: "localhost",
  port: 3306,
};

mutableConfig.host = "somewhere";
immutableConfig.host = "somewhere"; // 오류!

- immutableConfig는 readonly여서 오류 발생

 

(4) Pick<T,K>

- 찍먹하기

interface Person {
  name: string;
  age: number;
  address: string;
}

type SubsetPerson = Pick<Person, "name" | "age">;

const person: SubsetPerson = { name: "Spartan", age: 30 };

 

(5) Omit<T,K>

- 생략 & 스킵

- 20가지 중에서 3가지 생략하고싶을 때 사용

interface Person {
  name: string;
  age: number;
  address: string;
}

type SubsetPerson = Omit<Person, "address">;

const person: SubsetPerson = { name: "Alice", age: 30 };

 

 

끝.

반응형