TypeScript
를 공부하던 도중 Never 타입에 대해 알게 되었다. TypeScript-kr.gitbook의 설명은 아래와 같다.
- 절대 발생할 수 없는 타입을 나타낸다.
- 함수 표현식이나 화살표 함수 표현식에서 항상 오류를 발생시키거나 절대 반환하지 않는 반환 타입으로 쓰인다.
- 모든 타입에 할당 가능한 하위 타입이다.
- 함수의 마지막에 도달할 수 없다.
여기서 몇가지 의문이 들었다...
절대 발생할 수 없는 타입을 나타낸다❓
..? 그럼 발생하지 않는다면 왜 존재 하는 것인가?
함수의 마지막에 도달할 수 없다❓
..? 그럼.. 마지막에 도달할 수 없다면 함수의 모든 내용이 실행되지 않는다는 것인가?
조금 더 찾아보기 위해 TypeScript-Deep Dive를 참고했다. 조금 더 예시가 자세했다.
let foo: never = 123; // Error: Type number is not assignable to never
위 예시는 never
타입엔 다른 타입이 할당될 수 없음을 알려주고있다.
let foo: never;
let goo: any = 123;
foo = goo; // Error
위 예시는 실행해 봤을 때'any' 형식은 'never' 형식에 할당할 수 없습니다.ts(2322)
의 에러를 알려주고 있다. 핸드북의 설명처럼 never
타입은 any
타입 조차 할당될 수 없음을 알리고 있다.
function foo2(x: string | number): boolean {
if (typeof x === "string") {
return true;
} else if (typeof x === "number") {
return false;
}
return fail("Unexhaustive!");
}
function fail(message: string): never { throw new Error(message); }
let tmp: any = {id:"123"}
console.log(foo2(tmp))
예시를 조금 수정해서 실행해 보았다.결과는 아래와 같았다.
즉, 함수의 마지막에 도달할 수 없다.라는 부분이 명확이 이해가 되진않지만, never
타입으로 선언된 fail()
함수는 잘 실행 되었다.
하지만 아래와 같이 코드를 수정하면
function foo2(x: string | number): boolean {
if (typeof x === "string") {
return true;
} else if (typeof x === "number") {
return false;
}
return fail("Unexhaustive!"); //Error
}
function fail(message: string): void { throw new Error(message); }
'void' 형식은 'boolean' 형식에 할당할 수 없습니다.ts(2322)
라는 에러를 출력하는 것을 확인할 수 있었다. 이 예시로 봤을 때, foo2()
함수는 boolean
타입을 반환하도록 되어있다. 하지만 fail()
함수는 void
형이기 때문에 foo2()
함수가 사용될 수 없는 것이다. 이때, fail()
함수를 never
타입으로 선언하여 사용이 가능하도록 하는 부분이었다.
never를 반환하는 함수를 사용하면 불가능한 위치에 추가적인 코드를 사용하게끔 해 준다. 이는 더 나은 에러 메시지를 보여주거나 파일 또는 반복문과 같은 자원을 닫는 데 유용하다.
찾아보다 보니 타입을 정의하는데 있어서 활용하는 방법이 있는 것 같다. 이부분은 핸드북을 한번 쭉 살펴보고 추가적으로 내용을 보충해야겠다.
https://www.typescriptlang.org/ko/play#example/unknown-and-never
https://basarat.gitbook.io/typescript/type-system/never
https://typescript-kr.github.io/pages/basic-types.html