본문으로 바로가기

대표적으로 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


darren, dev blog
블로그 이미지 DarrenKwonDev 님의 블로그
VISITOR 오늘 / 전체