유틸리티 타입 (TS)
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"> 오밋해주면 어드레스를 빼는 객체를 생성할 수 있다.