기본적으로 타입스크립트는 자바스크립트의 특성에 따라 구조적 타입 시스템으로 이루어져있다.
하지만, 브랜딩타입을 이용하면 명목적 타입 시스템처럼 사용할 수 있다. (그 외 다른 방법들도 있다.)
명목적 타입 시스템이 필요한 이유가 뭘까?
function euroToUsd(euro: EUR): USD {
return (euro * 1.18 as USD)
}
위의 코드는 EUR를 USD로 환전해주는 함수이다. 보기에는 멀쩡해보이지만, 헛점은 있다.
함수의 인자로 EUR가 아닌 다른 나라의 통화를 전달할 때에도 문제없이 동작된다. (모든 통화는 number 타입이므로)
이 때, 브랜딩 타입을 이용하면 잘못된 통화가 함수로 들어왔을 때 탐지해줄 수 있다!
브랜딩 타입은 아래와 같이 만들 수 있다.
type Brand<Key extends string, Value> = Value & { __brand: Key }
브랜딩 타입은 실제로 존재하지않고, 커스텀 타입이다.
첫번째 파라미터인 Key는 base type이며, 두번째 파라미터인 Value는 outtag 또는 brand를 나타낸다.
결과적으로, brand의 private property인 "__brand" property와 base type이 교차하는 형태가 된다.
"__brand" 는 가상으로 네이밍한 것으로, 특정한 키워드가 아니다.
이제 브랜딩 타입을 이용하여 함수 안으로 잘못된 통화가 들어오지 않도록 리팩토링 할 수 있다!
type Brand<Key extends string, Value> = Value & { __brand: Key } //브랜딩 타입 생성
type USD = Brand<'USD', number> //Key가 'USD'로 된다.
type KRW = Brand<'KRW', number> //Key가 'KRW'로 된다.
type EUR = Brand<'EUR', number> //Key가 'EUR'로 된다.
const usd = 1.5 as USD //함수로 보낼 값에 as로 타입을 지정해준다.
const eur = 10 as EUR
const krw = 2000 as KRW
const USDToKRW = (amount: USD) => {
return (amount * 2500) as KRW
}
console.log(USDToKRW(usd))
참고
'📝 꾸준함이 무기 > TypeScript' 카테고리의 다른 글
TypeScript의 Generics! 도대체 언제 쓰는거니? (0) | 2021.09.25 |
---|