Search
Duplicate

never 타입과 느낌표(non-null assertion)

생성일
2023/02/20 02:22
태그
TypeScript

never 타입과 느낌표(non-null assertion)

never 타입?

타입스크립트에서 never 타입은 값의 공집합이다. 사실 또 다른 인기 자바스크립트 타입 시스템인 Flow 에서 never 타입은 empty 타입과 같다.
집합에 어떤 값도 없기 때문에, never 타입은 any 타입의 값을 포함해 어떤 값도 가질 수 없다. 그래서 never 타입은 때때로 점유할 수 없는 또는 바닥 타입이라고 불린다.
declare const any: any const never: never = any // X, 'any'타입은 'never'타입에 할당할 수 없다
JavaScript
복사
주의! 빈 배열을 선언할 때, 타입을 지정하지 않으면 never 타입이 찍히게 된다.

never 타입이 왜 필요할까?

숫자 체계에 아무것도 없는 양을 나타내는 0처럼, 문자 체계에도 불가능을 나타내는 타입이 필요하다.
타입스크립트에서의 “불가능”
값을 포함할 수 없는 빈 타입
제네릭과 함수에서 허용되지 않는 매개변수
호환되지 않는 타입들의 교차 타입
빈 합집합 (무의 합집합)
실행이 끝날 때, 호출자에게 제어를 반환하지 않는 함수의 반환 타입
예) Node의 process.exit
void는 호출자에게 함수가 유용한 것을 반환하지 않는다는 것이므로 혼동하지 않도록 한다
절대로 도달할 수 없을 else 분기의 조건 타입
거부된 프로미스에서 처리된 값의 타입
const p = Promise.reject('foo') // const p: Promise<never>
TypeScript
복사

never 타입은 어떻게 쓸까?

never 타입을 많이 사용하지 않을 수 있지만, 아래와 같이 적절한 사용 사례가 많이 있다.

허용할 수 없는 함수 매개변수에 제한을 가한다

never 타입을 이용해서 다양한 사용 사례에 놓인 함수에 제안을 걸 수 있다.

switch, if-else 문의 모든 상황을 보장한다

함수가 단 하나의 never 타입 인수만을 받을 수 있는 경우, (타입스크립트 컴파일러가 오류가 발생하지 않고는) 해당 함수를 never 타입 이외의 값으로 호출할 수 없다.
function fn(input: never) {} // 오직 `never` 만 받는다. declare let myNever: never fn(myNever) // ✅ // 아무 값이나 전달하거나 아무 값도 전달하지 않으면 타입 에러 발생 fn() // ❌ 인자 'input'에 아무 값도 주어지지 않음 fn(1) // ❌ 'number' 타입은 'never' 타입에 할당할 수 없음 fn('foo') // ❌ 'string' 타입은 'never' 타입에 할당할 수 없음 // `any`도 통과할 수 없다. declare let myAny: any fn(myAny) // ❌ 'any' 타입은 'never' 타입에 할당할 수 없음
TypeScript
복사
이런 함수를 이용하면 switch, if-else 문의 모든 상황을 보장할 수 있다. 이를 기본 케이스(default case)로 이용하면 남아있는 것은 never 타입이어야 하기 때문에 모든 상황에 대처하는 것을 보장할 수 있다.
function unknownColor(x: never): never { throw new Error("unknown color"); } type Color = 'red' | 'green' | 'blue' function getColorName(c: Color): string { switch(c) { case 'red': return 'is red'; case 'green': return 'is green'; default: return unknownColor(c); // 'string' 타입은 'never' 타입에 할당할 수 없음 } }
TypeScript
복사

타이핑을 부분적으로 허용하지 않는다

의도하지 않은 API 사용을 방지한다

이론적으로 도달할 수 없는 분기를 표기한다

유니언 타입에서 멤버 필터링

매핑된 타입의 키 필터링

제어 흐름 분석의 좁은 타입

호환되지 않는 타입의 불가능한 교차 타입 표시

느낌표 (non-null-assertion)

null이나 undefined가 아님을 보증하는 방식
끝에 ! 붙여준다.
하지만 실무에서는 비추!

ref)