1. enum
2. object literal (객체 리터럴)
3. 언제 enum? 언제 object literal?
1. Partial<T>
interface Person {
name: string;
age: number;
}
const updatePerson = (person: Person, fields: Partial<Person>): Person => {
return { ...person, ...fields };
};
const person: Person = { name: "James", age: 30 };
const changedPerson = updatePerson(person, { age: 31 });
2. Required<T>
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"; // 오류!
=> DatabaseConfig는 불변 객체라고 할 수 없음 (host가 readonly가 아니기 때문) 하지만 Readonly<T>타입으로 불변 객체로 만들 수 있음
4. Pick<T, K>
interface Person {
name: string;
age: number;
address: string;
}
type SubsetPerson = Pick<Person, "name" | "age">;
const person: SubsetPerson = { name: "James", age: 30 };
=> SubsetPerson은 Person이라는 인터페이스에서 name, age 속성만 선택해서 구성된 새로운 타입
5. Omit<T, K>
interface Person {
name: string;
age: number;
address: string;
}
type SubsetPerson = Omit<Person, "address">;
const person: SubsetPerson = { name: "Alice", age: 30 };