탈출구
상황에 따라서는 타입을 완벽하게 지정하지 않고도 어떤 작업이 안전하다는 사실을 TypeScript가 믿도록 만들고 싶을 때가 있습니다.
예를 들어 사용하고 있는 서드 파티 모듈의 타입 정의가 잘못되었음을 파악한 후, DefinitelyTyped에 수정 사항을 기여하기 앞서 코드에서 먼저 검증해보려 한다거나, 아폴로(Apollo)로 타입 선언을 다시 만들지 않은 채 API가 반환한 데이터를 사용해야 하는 상황일 수도 있습니다.
다행히 TypeScript는 안전한 작업임을 증명할 시간이 없을 때 활용할 수 있는 탈출구를 제공합니다.
명확하지 않다면, 다음에 나열하는 TypeScript 기능들은 되도록 적게 사용하는 게 좋습니다. 이 기능들에 너무 의존하는 상황이라면 무언가 잘못된 것일 수 있습니다.
타입 어서션(Type Assertion)
타입 B가 있고 A <: B <: C를 만족하면 타입 검사기에게 B는 실제로 A 거나 C라고 어서션(assertion; 단언, 확언)할 수 있습니다.
주의할 점은, 어떤 하나의 타입은 자신의 슈퍼 타입이나 서브 타입으로만 어서션할 수 있습니다.
예를 들어 number와 string은 서로 관련이 없으므로 number를 string이라고 어서션할 수는 없습니다.
TypeScript는 두 가지의 타입 어서션 문법을 제공합니다.
function formatInput(input: string){
// 블라 블라
}
function getMemberInput(): string | number {
// 블라 블라
}
let input = getMemberInput()
// input이 string이라고 어서션
formatInput(input as string) // ①
// 바로 위의 코드와 같은 의미
formatInput(<string>input) // ②
- 타입 어서션(as)를 이용해 TypeScript에게 input의 타입은 string | number가 아니라 string이라고 알려줍니다. 예시로 getMemberInput이 string을 반환한다는 사실을 확신하는 상황에서 formatInput 함수를 빠르게 테스트하려 할 때 이 방법을 활용할 수 있습니다.
- 기존엔 꺾쇠괄호 문법으로 타입 어서션을 정의했습니다. 두 문법 모두 같은 의미를 갖습니다.
타입 어서션엔 꺾쇠괄호(<>)보단 as 문법을 추천합니다.
꺾쇠괄호를 사용하면 TSX 문법과 혼동을 일으킬 수 있기 때문입니다.
TSLint의 noangle-bracket-type-assertion을 사용하면 이 규칙을 코드 베이스에 강제할 수 있습니다.
두 타입 사이에 연관성이 충분하지 않아서 한 타입을 다른 타입이라고 어서션할 수 없는 때도 있습니다.
이 문제는 단순히 any라고 어서션하여 우회할 수 있습니다.
하지만 그렇게 해버리면 언뜻 봐도 안전하지 않은 타입 어서션이므로 되도록 피해야 합니다.
function addToList(list: string[], item: string){
// 블라 블라
}
addToList('이거 정말로' as any, '안전하지 않음 ㅇ.ㅇ')
'👶 TypeScript' 카테고리의 다른 글
탈출구 - 확실한 할당 어서션 (0) | 2023.01.22 |
---|---|
탈출구 - Nonnull 어서션 (0) | 2023.01.22 |
조건부 타입 - 내장 조건부 타입들 (0) | 2023.01.21 |
조건부 타입 - infer 키워드 (0) | 2023.01.21 |
조건부 타입 - 분배적 조건부 (0) | 2023.01.21 |