<TS> 소진 검사 Exhaustiveness Check과 Never Type

·2023년 8월 27일
0

TypeScript

목록 보기
7/8

소진 검사

never 타입을 이용한 소진 검사

Exhaustiveness Check

가능한 모든 옵션을 다 썼는지 확인하기 위해 사용됩니다.

Type never
never type은 어디든 할당됩니다.
하지만 never에는 어떤 타입도 할당할 수 없습니다.
이러한 특징은 에러 핸들링으로 사용할 수 있습니다.

  1. 모든 Type 옵션을 다 작성했을 시에는 에러가 발생하지 않습니다.
// ...코드 생략

type FarmAnimal = Pig | Rooster | Cow;

function getFarmAnimalSound(animal: FarmAnimal) {
  // 타입에 공통된 속성을 지정하고, switch문으로 판별 가능.
  // if문으로도 당연히 가능합니다.
  switch (animal.kind) {
    case "pig":
      console.log(animal);
      return "돼지를 판별했습니다.";
    case "cow":
      console.log(animal);
      return "소를 판별했습니다.";
    case "rooster":
      console.log(animal);
      return "닭를 판별했습니다.";
    default:
      const nothingAnimal: never = animal;
  }
}
  1. 만약 모든 타입을 명시하지 않았을 때, default 부분에서 에러가 아래처럼 발생합니다.

이유는, 1번과 달리 Sheep이라는 타입을 하나 더 추가했습니다.
그러나 switch문에 Sheep case를 작성하지 않았습니다.

default에 never 타입을 이용하여 타입 소진 검사(에러 핸들링)를 진행한 모습입니다.

에러 해결 방법으로는 sheep case만 추가해주면 에러는 사라집니다.
이로써 모든 타입을 사용했음을 알 수 있습니다.

// sheep case 추가

type FarmAnimal = Pig | Rooster | Cow | Sheep;

function getFarmAnimalSound(animal: FarmAnimal) {
  // 타입에 공통된 속성을 지정하고, switch문으로 판별 가능.
  switch (animal.kind) {
    case "pig":
      console.log(animal);
      return "돼지를 판별했습니다.";
    case "cow":
      console.log(animal);
      return "소를 판별했습니다.";
    case "rooster":
      console.log(animal);
      return "닭를 판별했습니다.";
    case "sheep":
      console.log(animal);
      return "닭를 판별했습니다.";
    default:
      const _exhaustiveCheck: never = animal;
      return alert(_exhaustiveCheck);
  }
}
profile
- 배움에는 끝이 없다.

0개의 댓글