카테고리 없음

유틸리티 타입 (TS)

wooseobsssss 2023. 12. 20. 12:26

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

 

이와 같이 속성을 이름, 에이쥐의 속성을 제시하면

이름만, 에이쥐만, 이름과 에이쥐가 같이만 들어 올 수 있도록 하는 속성이다.

 

 


Required<T>

 

모든 속성이 전부 제공되는 객체를 생성해야한다.

 

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

 

위와같이 NAME, AGE, ADRESS 모두가 들어가는 속성 객체를 생성해야하는데

 

ADDRESS 뒤에 ?가 붙으면서 ADRESS는 있어도 없어도괜찮다인데


 

type RequiredPerson = Required<Person>; 이런 식으로 

 

REQUIRE 해주면 

 

NAME, AGE, ADDRESS가 모두 붙어야 한다. 

 


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

 

READONLY로 PORT을 설정하면 PORT외에  HOST는 가변성이다.

 

아래의 immutableConfig: Readonly은 객체를 리드온리해서 불변의 속성을 만들었다.


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 };

 

이런식으로 타입을 지정해주고 그중 K속성을 PICK해서 쓰는것이다. 

위와같이 NAME AGE을 픽해서 받을 수 있다.


Omit<T, K>

 

생략하고 스킵하는 타입

 

타입 T에서 K 속성들만 제외한 새로운 타입을

 

예를들어 속성이 30개면 3개를 빼야한다면 27개를 픽하는것보다 3개를 OMIT하는게 빠를거다

 

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

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

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

 

이런 식으로 OMIT<PERSON, "ADDRESS"> 오밋해주면 어드레스를 빼는 객체를 생성할 수 있다.