[TypeScript] 유틸리티 타입

소이뎁·2023년 8월 16일
0

TypeScript-코딩앙마

목록 보기
8/8
post-thumbnail

🌈 코딩앙마의 TypeScript 강좌 수강 후, 이해한 내용을 정리한 글입니다.

유틸리티 타입(Utility Types)

TypeScript는 타입 변환을 용이하게 하는 여러 유틸리티 타입을 제공한다.

keyof

프로퍼티의 키들을 유니언 타입으로 변환할 때 사용한다. 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";

Partial<T>

모든 프로퍼티를 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";
// }

Required<T>

모든 프로퍼티를 필수로 변경한다.

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;
}
*/

Readonly<T>

모든 프로퍼티를 읽기 전용으로 변경한다.

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;
}
*/

Record<K, T>

프로퍼티 키가 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;
}

Pick<T, K>

T에서 K 프로퍼티만 선택하여 타입을 구성한다.

interface User {
	id: number;
  	name: string;
  	age: number;
  	gender: "M" | "W";
}

let admin: Pick<User, "id" | "name"> = {
	id: 0,
  	name: "Bob",
};

Omit<T, K> - 프로퍼티로 제거

T에서 K 프로퍼티를 제거하여 타입을 구성한다.

interface User {
	id: number;
  	name: string;
  	age: number;
  	gender: "M" | "W";
}

let admin: Omit<User, "age" | "gender"> = {
	id: 0,
  	name: "Bob",
};

Exclude<UnionType, ExcludedMembers> - 타입으로 제거

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

NoneNullable<T>

T에서 null, undefined를 제외하여 타입을 구성한다.

type T1 = string | null | undefined | void;
type T2 = NoneNullable<T1>; // type T1 = string | void

0개의 댓글