🌈 코딩앙마의
TypeScript 강좌
수강 후, 이해한 내용을 정리한 글입니다.
TypeScript는 타입 변환을 용이하게 하는 여러 유틸리티 타입을 제공한다.
프로퍼티의 키들을 유니언 타입으로 변환할 때 사용한다. keyof는 유틸리티 타입이 아닌 타입 연산자이다.
interface User {
id: number;
name: string;
age: number;
gender: "m" | "f";
}
type UserKey = keyof User; // type UserKey = 'id' | 'name' | 'age' | 'gender'
const uk: UserKey = "age";
모든 프로퍼티를 optional로 변경한다.
interface User {
id: number;
name: string;
age: number;
gender: "m" | "f";
}
let admin: Partial<User> = {
id: 1,
name: "Bob",
};
// 📍 아래와 동일하게 인식
// interface User {
// id?: number;
// name?: string;
// age?: number;
// gender?: "m" | "f";
// }
모든 프로퍼티를 필수로 변경한다.
interface User {
id: number;
name: string;
age?: number;
}
let admin: Required<User> = { // ❌ Error! age가 없음
id: 1,
name: "Bob",
};
/*
📍 아래와 동일하게 인식
interface User {
id: number;
name: string;
age: number;
}
*/
모든 프로퍼티를 읽기 전용으로 변경한다.
interface User {
id: number;
name: string;
age?: number;
}
let admin: Readonly<User> = {
id: 1,
name: "Bob",
};
admin.id = <4; // ❌ Error! 읽기 전용이므로 수정 불가
/*
📍 아래와 동일하게 인식
interface User {
readonly id: number;
readonly name: string;
readonly age: number;
}
*/
프로퍼티 키가 K이고, 프로퍼티 값이 T인 타입을 정의한다. 타입의 프로퍼티를 다른 타입에 매핑하는 데 사용할 수 있다. 예를 들어, 아래의 코드를
interface Score {
"1": "A" | "B" | "C" | "D";
"2": "A" | "B" | "C" | "D";
"3": "A" | "B" | "C" | "D";
"4": "A" | "B" | "C" | "D";
}
const score: score = {
1: "A",
2: "C",
3: "B",
4: "B",
}
Records를 사용하여 아래의 코드로 나타낼 수 있다.
type Grade = "1" | "2" | "3" | "4";
type Score = "A" | "B" | "C" | "D";
const score: Record<Grade, Score> = {
1: "A",
2: "C",
3: "B",
4: "B",
}
/*
📍 Type Aliases를 사용하지 않은 경우
const score: Record<"1" | "2" | "3" | "4", "A" | "B" | "C" | "D"> = {
1: "A",
2: "C",
3: "B",
4: "B",
}
/*
interface, keyof와 함께 사용하여 아래와 같은 코드도 가능하다.
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;
}
T에서 K 프로퍼티만 선택하여 타입을 구성한다.
interface User {
id: number;
name: string;
age: number;
gender: "M" | "W";
}
let admin: Pick<User, "id" | "name"> = {
id: 0,
name: "Bob",
};
T에서 K 프로퍼티를 제거하여 타입을 구성한다.
interface User {
id: number;
name: string;
age: number;
gender: "M" | "W";
}
let admin: Omit<User, "age" | "gender"> = {
id: 0,
name: "Bob",
};
UnionType에서 ExcludedMembers를 제외하여 타입을 구성한다.
// 예시1
type T1 = string | number;
type T2 = Exclude<T1, number>; // type T2 = string
// 예시2
type T1 = string | number | boolean;
type T2 = Exclude<T1, number | string>; // type T2 = boolean
T에서 null, undefined를 제외하여 타입을 구성한다.
type T1 = string | null | undefined | void;
type T2 = NoneNullable<T1>; // type T1 = string | void