타입스크립트 개발을 진행하면서 타입스크립트에 대해서 여러가지 배워가고 있다. 그 중에 type들이나 interface 등을 새롭게 공부하면서 유틸리티 타입에 대해서 접하게 되었고, 다양한 유틸리티 타입에 대해서 정리해보려고 한다.
유틸리티 타입은 이미 정의해 놓은 타입을 변환하여 사용할 때 주로 사용하는 문법이다. 기존의 인터페이스와 제네릭 등만 활용해도 타입 변환 활용이 가능하지만, 유틸리티 타입을 적절히 활용하면 훨씬 간결하고 효율적으로 타입 변환이 가능하다.
파셜(Partial) 타입은 특정 타입의 부분 집합을 만족하는 타입을 정의할 수 있다. 기존에는 필수적으로 있어야 할 타입들이 Partial을 이용하면 인터페이스에서 일부 타입만 활용이 가능하다.
interface Player {
name: string
position: string
}
type MayHaveName = Partial<Player>
const me: MayHaveEmail = {} // 가능
const mount: MayHaveEmail = { name: 'mason mount' } // 가능
const lukaku: MayHaveEmail = { name: 'romelu lukaku', position: 'striker' } // 가능
픽(Pick) 타입은 특정 타입에서 몇 개의 속성을 선택하여 타입을 정의할 수 있다. 기존에는 속성이 전부 필요했다면 특정 속성 몇개만 선택하여 타입을 정의하는 것이 가능해지는 것이다.
interface Player {
name: string
position: string
}
const human: Pick<Player, 'name'> = {
name: 'ngolo kante',
}
type HasThen<T> = Pick<Promise<T>, 'then' | 'catch'>
let hasThen: HasThen<number> = Promise.resolve(4)
hasThen.then // 위에서 'then'만 선택하면 'then'만 제공, 'catch' 선택하면 'catch만 제공'
오밋(Omit) 타입은 특정 타입에서 지정된 속성을 제거하여 타입을 정의할 수 있다.
interface Player {
name: string
position: string
number: number
team: string
}
const mount: Omit<Player, 'number'> = {
name: 'mason mount',
position: 'midfielder',
team: 'chelsea',
}
const kovacic: Omit<Player, 'number' | 'team'> = {
name: 'kovacic',
position: 'midfielder',
}
리콰이얼드(Required) 타입은 파셜 타입의 반대 개념으로 특정 타입에서 지정된 속성을 모두 필수로 하여 타입을 정의할 수 있다.
interface Player {
name: string
position?: string
number?: number
team?: string
}
const obj: Player = { name: 'timo werner' };
const obj2: Required<Player> = {
name: 'kai havertz',
position:'midfielder',
number: 29
};
Property 'team' is missing in type '{ name: 'kai havertz', position:'midfielder',number: 29 }' but required in type 'Required<Player>'.
Readonly 타입은 모든 타입을 Readonly하게 만들어 주는 타입으로 const 변수와 같이 재할당 할 수 없는 속성으로 정의하는 것이다.
interface Player {
name: string
}
const firstPlayer: Readonly<Player> = { name: 'timo werner' };
firstPlayer.name = "mason mount";
Cannot assign to 'name' because it is a read-only property.
위에 소개한 유틸리티 타입 외에도 Record
,Exclude
,Extract
,NonNullable
등 여러가지 유틸리티 타입들이 존재한다. 사용하다가 더 필요한 부분들이 있으면 그때 그때 찾아보고 정리해보도록 하자
출처