기존의 인터페이스나 제니릭 등의 기본 문법보다 훨씬 더 간결한 문법으로 타입으로 타입을 정의 할 수 있으며 이미 정의해놓은 타입을 변환할 때 유용하게 쓰인다.
자주 사용되는 유틸리티 타입 몇가지
1. Partial:
특정 타입의 부분 집합을 만족하는 타입을 정의 할 수 있다.
모든 속성이 필수적으로 들어가지 않아도된다.
interface Person {
name: string;
age: number;
}
const updatePerson = (person: Person, fields: Partial<Person>): Person => {
return { ...person, ...fields };
};
const person: Person = {} // 가능
const person: Person = { name: "Spartan", age: 30 };
const changedPerson = updatePerson(person, { age: 31 });
interface Person {
name: string;
age: number;
address?: string; // 속성 명 뒤에 붙는 ?가 뭘까요
}
type RequiredPerson = Required<Person>;
interface Person {
name: string;
age: number;
address: string;
}
type SubsetPerson = Pick<Person, "name" | "age">;
const person: SubsetPerson = { name: "Spartan", age: 30 };
아래는 Persone에서 address를 Omit으로 제외한 새로운 타입 SunsetPerson을 확인할 수 있다.
interface Person {
name: string;
age: number;
address: string;
}
type SubsetPerson = Omit<Person, "address">;
const person: SubsetPerson = { name: "Alice", age: 30 };
앞에 readonly를 붙인 immutalbleConfig의 host를 "string"에서 "somewhere"로 바꿀려고 접근할 시 에러가 뜨는걸 확인 할 수 있다.
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"; // 오류!