종합성(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는 무엇이 잘못되었는지 친절히 알려줍니다.
위의 에러 메시지는 코드에서 처리하지 않는 상황이 있거나 어떤 상황이든 대처할 수 있는 반환문을 함수 마지막에 추가해야 한다고 말해줍니다.
아니면 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 플래그를 활성화하면 함수 코드의 모든 경로에서 값을 반환하는지 확인할 수 있습니다. 이 플래그를 활성화할지는 개발자의 결정에 달렸습니다.
'👶 TypeScript' 카테고리의 다른 글
객체 타입의 타입 연산자 - keyof 연산자 (0) | 2023.01.19 |
---|---|
객체 타입의 타입 연산자 - 키인 연산자 (0) | 2023.01.19 |
정제 - 차별된 유니온 타입 (0) | 2023.01.19 |
정제 (0) | 2023.01.19 |
타입 넓히기 - 초과 프로퍼티 확인 (0) | 2023.01.18 |