Front-end/TypeScript

[TypeScript] 유틸리티 타입, 맵드 타입

이안92 2021. 6. 1. 16:11
반응형

 유틸리티 타입

 

기본 문법으로 충분히 타입을 변환할 수 있지만, 유틸리티 타입을 쓰면 이미 정의해 놓은 타입을 변환하거나 코드를 줄여 간결하게 정의할 수 있다. 제네릭타입이라고도 불리운다.

 

Pick

 

타입을 불필요하게 정의하지 않아도 되며 간편하고 간결하게 만들어 준다.

interface Product {
    id: number;
    name: string;
    price: number;
    brand: string;
    stock: number;
}

function fetchProducts(): Promise<Product[]> {
    // ...
}

Product의 일부(id, name, price)만 가지고 와야 하므로 Product를 쓰지 못함.

밑의 방법은 새로운 인터페이스를 만들기 때문에 권장되지 않는다.

interface ProductDetail {
    id: number;
    name: string;
    price: number;
}

function displayProductDetail(shoppingItem: ProductDetail) {
}

Pick<타입명, 개체들>

type ShoppingItem = Pick<Product, 'id' | 'name' | 'price'>
function displayProductDetail2(shoppingItem: Pick<Product, 'id' | 'name' | 'price'>) {
}

 

Omit

 

특정 타입에서 지정된 속성만 제거한 타입을 정의.

interface AddressBook {
    name: string;
    phone: number;
    address: string;
    company: string;
}

const phoneBook: Omit<AddressBook, 'address'> = {
    name: '이안',
    phone: 123456789,
    company: '서울 중구'
}

const friend: Omit<AddressBook, 'address'|'company'> = {
    name: '친구집',
    phone: 987654321
}

 

Partial

모든 속성을 Optional(선택적)로 처리해준다.

// interface UpdateProduct {
//     id?: number;
//     name?: string;
//     price?: number;
//     brand?: string;
//     stock?: number;
// }

type UpdateProduct = Partial<Product>
function updateProductItem(productItem: Partial<Product>) {

}

 

유틸리티 타입 구현

 

interface UserProfile {
    username: string;
    email: string;
    profilePhotoUrl: string;
}

// 옵셔널만 추가한 경우 불필요한 타입 중복 정의됨
interface UserProfileUpdate {
    username?: string;
    email?: string;
    profilePhotoUrl?: string;
}

// #1 타입별칭으로 타입들만 옵셔널
type UserProfileUpdate = {
    username?: UserProfile['username'];
    email?: UserProfile['email'];
    profilePhotoUrl?: UserProfile['profilePhotoUrl'];
}

// #2 세 줄로 된 것을 한 줄로 줄임(맵드 타입)
type UserProfileUpdate = {
    [p in 'username' | 'email' | 'profilePhotoUrl']?: UserProfile[p]
}

// #3 keyof로 바꿈
type UserProfileUpdate = {
    [p in keyof UserProfile]?: UserProfile[p]
}

// #4 제네릭 사용 UserProfile -> T
type Subset<T> = {
    [p in keyof T]?: T[p]
}

 

 맵드 타입

 

기존에 존재하는 타입을 맵드 타입의 문법을 이용해 새로운 타입으로 변환하는 것.

 

Array의 map함수의 효과를 가진다.

// for in 반복문 코드
var arr = ['a', 'b', 'c'];
for (var key in arr) {
    console.log(arr[key]);
}

기본 문법 { [ P in K ] : T }

type Animals = 'Dog' | 'Cat' | 'Tiger'
type AnimalAges = { [K in Animals]: number }
const ages: AnimalAges = {
    Dog: 2,
    Cat: 1,
    Tiger: 3,
}
반응형