👶 TypeScript

철저 검사(Exhaustiveness Checking)라 불리는 종합성(Totality)

개발자 린다씨 2023. 1. 19. 14:00
반응형

종합성(Totality)

철저 검사라고도 불리는 종합성은 필요한 모든 상황을 제대로 처리했는지 타입 검사기가 검사하는 기능입니다.

 

종합성은 하스켈, 오캐멀 등 패턴 매칭을 사용하는 언어에서 차용한 기능입니다.

 

TypeScript는 다양한 상황의 모든 가능성을 확인하며, 빠진 상황이 있다면 이를 경고합니다.

 

실제로 일어날 버그를 방지하는 데 아주 도움 되는 기능입니다.

 

아래 예를 살펴보겠습니다.

type DayOfTheWeek = 'Mon' | 'Tue' | 'Wed' | 'Thu' | 'Fri'
type Day = DayOfTheWeek | 'Sat' | 'Sun'

function getNextDay(d: DayOfTheWeek): Day { // 함수에 끝 return 문이 없으며 반환 형식에 'undefined'가 포함되지 않습니다.ts(2366)
    switch(d) {
        case 'Mon': return 'Tue'
    }
}

이렇게 일주일이 빨리 갈리가 없습니다;)

 

TypeScript는 무엇이 잘못되었는지 친절히 알려줍니다.

함수에 끝 return 문이 없으며 반환 형식에 'undefined'가 포함되지 않습니다.ts(2366)

위의 에러 메시지는 코드에서 처리하지 않는 상황이 있거나 어떤 상황이든 대처할 수 있는 반환문을 함수 마지막에 추가해야 한다고 말해줍니다.

 

아니면 getNextDay의 반환 타입을 Day | undefined로 바꿔야 합니다.

 

각 요일에 해당하는 case를 빠짐없이 추가하면 에러가 사라집니다.(직접 해보시는 걸 추천합니당)

 

위의 경우엔 getNextDay의 반환 타입을 Day로 지정했으나 모든 경로에서 Day 타입을 반환하지 않고 있으므로 TypeScript가 경고해 준 것입니다.

 

사실 이 예제의 세부 구현은 중요하지 않습니다.

 

switch, if, throw 등 어떤 구조를 사용하든 TypeScript는 모든 상황을 다 고려했는지 확인합니다.

 

아래는 또 다른 예입니다.

function isBig(n: number) {
  if (n >= 100) {
    return true;
  }
}

값을 반환하지 않는 코드 경로가 존재합니다.ts(7030)

 

isBig 함수에서 100 미만의 숫자를 처리한다는 코드가 없습니다만 이번에도 TypeScript가 이를 확인하고 있습니다.

TSC 플래그: noImplicitReturns

tsconfig.json에서 noImplicitReturns 플래그를 활성화하면 함수 코드의 모든 경로에서 값을 반환하는지 확인할 수 있습니다. 이 플래그를 활성화할지는 개발자의 결정에 달렸습니다.

 
반응형