// keyof
interface User {
id: number;
name: string;
age: number;
gender: 'M' | 'F';
}
type UserKey = keyof User; // 'id' | 'name' | 'age' | 'gender'
const uk: UserKey = 'age';
// Partial<T>
interface User {
id: number;
name: string;
age: number;
gender: 'M' | 'F';
}
let admin: Partial<User> = {
id: 1,
name: 'Bob',
};
- Partial은 모든 속성에 대해서 optional을 걸어준다.
// Required<T>
interface User {
id: number;
name: string;
age?: number;
gender: 'M' | 'F';
}
let admin: Required<User> = {
id: 1,
name: 'Bob',
age: 30,
gender: 'M'
};
- Required는 optional이 있는 속성들도 필수 속성들로 바꿔준다.
// Readonly<T>
interface User {
id: number;
name: string;
age?: number;
}
let admin: Readonly<User> = {
id: 1,
name: 'Bob',
};
admin.id = 4; // error 발생
- Readonly는 이후에 값이 바뀌는 것을 방지한다.
// Record<K, T>
type Grade = '1' | '2' | '3' | '4';
type Score = 'A' | 'B' | 'C' | 'D';
const score: Record<Grade, Score> = {
1: 'A',
2: 'B',
3: 'C',
4: 'D',
};
// Record<K, T>
interface User {
id: number;
name: string;
age: number;
}
function isValid(user: User) {
const result: Record<keyof User, boolean> = {
id: user.id > 0,
name: user.name !== '',
age: user.age > 0,
};
return result;
}
// Pick<T,K>
interface User {
id: number;
name: string;
age: number;
gender: 'M' | 'W';
}
const admin: Pick<User, 'id' | 'name'> = {
id: 0,
name: 'Bob',
};
- Pick에서 지정한 property만 사용할 수 있다.
// Omit<T,K>
interface User {
id: number;
name: string;
age: number;
gender: 'M' | 'W';
}
const admin: Omit<User, 'age' | 'gender'> = {
id: 0,
name: 'Bob',
};
- Omit에서 지정한 property를 제외하고 사용할 수 있다.
// Exclude<T1,T2>
type T1 = string | number | boolean;
type T3 = Exclude<T1, number | string>;
// NonNullable<Type>
type T1 = string | null | undefined | void;
type T2 = NonNullable<T1>;
- T2의 type에서 null과 undefined를 제외시킨다.