본문 바로가기

TypeScript

[TypeScript] 유틸리티 타입

1. Partial <T>

 

- 타입 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 });

 

 

Person 이라는 인터페이스는 name, age 라는 속성으로 구성된다. 위의 updatedPerson 함수를 자세히 보면, 2번째 인자로 Partial<Person> 타입의 fields 를 받는다.

 

이 field 라는 인자가 구성되는 경우의 수

- name 이라는 속성만 있어도 됨.

- age 라는 속성만 있어도 됨.

- name, age 라는 속성이 둘 다 있어도 됨.

- 이 밖의 상황은 허용되지 않음 ex) { name, gender } 와 같이 기존에 없는 속성을 넣으면 안 됨.

 

이런식으로 Partial<T> 타입으로 유연하게 속성을 선택하여 객체를 만들 수 있다.

 


2. Required<T>

 

- Partial<T> 타입과는 반대로 Required<T> 타입은 타입 T의 모든 속성을 필수적으로 만든다.

- 다시말해, T타입 객체에 정의 된 모든 속성이 반드시 전부 제공되는 객체를 생성할 때 쓰임

 

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

위의 Person 인터페이스에 address 라는 속성이 새로 생겼는데, 이 뒤에 ? 가 붙어있음. 이는 선택적 속성으로, 있어도 되고 없어도 된다는 뜻임.

 

그러나 address 도 필수적으로 받아야 한다고 하면, 다음과 같이 작성한다. 이렇게 하면 address 입력도 필수가 됨.

type RequiredPerson = Required<Person>;

 


 

3. ReadOnly<T>

 

- ReadOnly<T> 타입은 T의 모든 속성을 읽기 전용(read-only) 로 만든다. 

- 이를 통해 readonly 타입의 속성들로 구성된 객체가 아니어도, 완전한 불변 객체로 취급 가능

 

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"; // 오류!

 

참고로, DatabaseConfig 는 불변객체가 아니다. 그 이유는 host 가 readonly 가 아니기 때문.

 


4. Pick<T,K>

 

- Pick<T,K> 타입은 T에서 K속성들만 선택하여 새로운 타입을 만든다.

- 이를 통해 타입 일부 속성만 포함하는 객체를 쉽게 생성 가능

 

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

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

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

 

위처럼 SubsetPerson 은 Person 이라는 인터페이스에서 name, age 속성만 선택해서 구성된 새로운 타입임.

 


5. Omit<T,K> 

 

- Omit<T,K> 타입은 타입 T에서 K 속성들만 제외한 새로운 타입을 만든다.

- Pick<T,K> 와는 반대의 동작을 한다.

- 이를 통해 기존 타입에서 특정 속성을 제거한 새로운 타입 쉽게 생성 가능

 

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

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

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

 

여기서 SubsetPerson 타입은 address 속성만 제거한 새로운 타입이다. 

 

 

 

이 밖의 다양한 유틸리티 타입 

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

'TypeScript' 카테고리의 다른 글

[TypeScript] 클래스  (0) 2023.07.26
[TypeScript] 프로젝트 세팅  (0) 2023.07.26
[TypeScript] enum 과 object literal 비교  (0) 2023.07.26
[TypeScript] Any, unknown, union  (0) 2023.07.25
[TypeScript] const, readonly  (0) 2023.07.25