대표적으로 switch 문에서, 모든 case에 대한 처리가 이루어지지 않아서 default로 빠지게 되는 경우가 있다.
typescript에서는 이러한 케이스를 방지할 수 있다. 아래와 같은 케이스를 살펴보자.
interface Circle {
kind: 'circle'
radius: number
}
interface Square {
kind: 'square'
sideLength: number
}
type Shape = Circle | Square
function getArea (shape: Shape) {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2
// 실수로 shape가 Square인 부분을 handling 하지 못했음.
// 따라서 default로 빠지게 됨.
default:
// 분명 never니까 값이 들어오면 안된다.
// 그런데 shape가 Square인 부분을 핸들링하지 못했으니 default로 빠지게 됨.
// 이런 케이스가 없었으면 한다면 다음과 같이 checking 한다.
const _exhaustiveCheck: never = shape
return _exhaustiveCheck
}
}
그러나 모든 switch 구문에 대해서 다음과 같은 체킹을 하는 것을 힘들다.
함수로 만들어서 switch문에 살짝 끼워넣어보자.
interface Circle {
kind: 'circle'
radius: number
}
interface Square {
kind: 'square'
sideLength: number
}
type Shape = Circle | Square
function exhaustiveCheck (param: never) {
throw new Error('exhaustive check fail')
}
function getArea (shape: Shape) {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2
default:
// Argument of type 'Square' is not assignable to parameter of type 'never'.
exhaustiveCheck(shape)
}
}
ref)
https://dev.to/babak/exhaustive-type-checking-with-typescript-4l3f
'Programming Language > 🟦 Typescript' 카테고리의 다른 글
func in TS (2) : generic func, 타입 제약 (0) | 2021.08.14 |
---|---|
func in TS (1) : 함수 시그니처, type(타입 별칭), void (0) | 2021.08.14 |
type narrowing(type guard)와 Type Predicates(타입 명제) (0) | 2021.08.07 |
literal type과 const assertion (0) | 2021.08.07 |
Utility types : Partial, Record, Pick, Omit ... (0) | 2021.05.30 |