유틸리티 타입 소개
유틸리티 타입은 타입스크립트에서 기본 제공되는 타입 변형 도구입니다. 이러한 타입을 사용하면 기존 타입을 바탕으로 새로운 타입을 쉽게 정의할 수 있으며, 특정 속성을 선택, 제거, 필수화하거나 옵션으로 변경하는 등 다양한 변형을 수행할 수 있습니다. 주요 유틸리티 타입은 Partial, Required, Readonly, Record, Pick, Omit, Exclude, Extract, ReturnType 등이 있습니다.
1. Partial, Required, Readonly
Partial
- 기능: 객체 타입의 모든 속성을 **옵션(optional)**으로 변경합니다.
- 예시:
-
type Person = { name: string; age: number }; type PartialPerson = Partial<Person>; // PartialPerson 타입은 { name?: string; age?: number }와 같습니다.
- 용도: 전체 속성이 필요하지 않은 객체를 임시로 정의할 때 유용합니다. 예를 들어, 일부 필드만 수정할 수 있는 객체를 표현할 때 사용할 수 있습니다.
Required
- 기능: 객체 타입의 모든 속성을 **필수(required)**로 만듭니다.
- 예시:
-
type Person = { name?: string; age?: number }; type RequiredPerson = Required<Person>; // RequiredPerson 타입은 { name: string; age: number }와 같습니다.
- 용도: 선택적 필드가 있는 타입을 필수적으로 사용해야 하는 상황에서 유용합니다.
Readonly
- 기능: 객체 타입의 모든 속성을 **읽기 전용(read-only)**으로 만듭니다.
- 예시:
-
type Person = { name: string; age: number }; type ReadonlyPerson = Readonly<Person>; // ReadonlyPerson 타입은 { readonly name: string; readonly age: number }와 같습니다.
- 용도: 객체가 수정되지 않아야 하는 상황에서 사용합니다. 예를 들어, 상수로 다뤄야 하는 객체나 불변 객체로 관리하고 싶은 경우 유용합니다.
2. Record, Pick, Omit
Record
- 기능: 특정 키와 값을 기반으로 객체 타입을 생성합니다.
- 형식: Record<KeyType, ValueType>
- 예시:
-
type Role = "admin" | "user" | "guest"; type Permissions = Record<Role, string[]>; // Permissions 타입은 { admin: string[]; user: string[]; guest: string[] }와 같습니다.
- 용도: 특정 키와 그에 대응하는 값을 매핑해야 할 때 유용합니다. 예를 들어, 여러 역할(Role)에 따른 권한 목록을 정의할 때 사용할 수 있습니다.
Pick
- 기능: 특정 타입에서 일부 속성만 선택하여 새로운 타입을 만듭니다.
- 예시:
-
type Person = { name: string; age: number; location: string }; type NameAndAge = Pick<Person, "name" | "age">; // NameAndAge 타입은 { name: string; age: number }와 같습니다.
- 용도: 큰 타입에서 필요한 속성만 선택하여 사용하고 싶을 때 유용합니다. 특히 API 응답에서 필요한 데이터만 추출해 타입을 정의할 때 활용할 수 있습니다.
Omit
- 기능: 특정 타입에서 일부 속성을 제외하여 새로운 타입을 만듭니다.
- 예시:
-
type Person = { name: string; age: number; location: string }; type WithoutLocation = Omit<Person, "location">; // WithoutLocation 타입은 { name: string; age: number }와 같습니다.
- 용도: 타입에서 특정 속성을 제거하고 싶을 때 유용합니다. 예를 들어, 민감한 정보나 불필요한 필드를 제거한 객체 타입을 정의할 때 사용됩니다.
3. Exclude, Extract, ReturnType
Exclude
- 기능: 한 타입에서 다른 타입을 제외한 타입을 생성합니다.
- 형식: Exclude<UnionType, ExcludedMembers>
- 예시:
-
type T = "a" | "b" | "c"; type WithoutA = Exclude<T, "a">; // WithoutA 타입은 "b" | "c" 입니다.
- 용도: 유니언 타입에서 특정 타입을 제거해야 할 때 유용합니다.
Extract
- 기능: 한 타입에서 다른 타입과 겹치는 부분만 추출하여 새로운 타입을 생성합니다.
- 형식: Extract<UnionType, IncludedMembers>
- 예시:
-
type T = "a" | "b" | "c"; type OnlyA = Extract<T, "a">; // OnlyA 타입은 "a" 입니다.
- 용도: 유니언 타입에서 특정 타입만 추출하여 사용할 때 유용합니다.
ReturnType
- 기능: 함수 타입에서 반환 타입을 추출합니다.
- 예시:
-
function getName(): string { return "hello"; } type NameType = ReturnType<typeof getName>; // NameType 타입은 string 입니다.
- 용도: 함수의 반환 타입을 추출하여 다른 타입에 활용하고자 할 때 유용합니다. 이를 통해 함수의 반환 타입이 변경될 때 의존하는 다른 타입도 자동으로 변경될 수 있습니다.
요약
타입스크립트 유틸리티 타입은 다음과 같은 기능을 제공하여 타입 시스템을 더욱 유연하고 강력하게 만듭니다.
- Partial, Required, Readonly: 객체의 속성을 선택적, 필수적, 읽기 전용으로 변환합니다.
- Record, Pick, Omit: 새로운 객체 타입을 생성하거나 기존 타입에서 특정 속성을 선택/제외하여 변형합니다.
- Exclude, Extract, ReturnType: 유니언 타입에서 원하는 타입만 추출하거나 제외하고, 함수의 반환 타입을 추출할 수 있습니다.
이러한 유틸리티 타입을 활용하면 코드의 재사용성과 안정성을 높이면서도 타입 시스템을 더 유연하게 활용할 수 있습니다.
'TypeScript' 카테고리의 다른 글
TypeScript 조건부 타입 (1) | 2024.11.03 |
---|---|
TypeScript 타입조작하기 (0) | 2024.11.02 |
TypeScript 제네릭2 (0) | 2024.10.29 |
TypeScript 제네릭1 (1) | 2024.10.29 |
TypeScript 인터페이스로 구현하는 클래스 (0) | 2024.10.29 |