TypeScript - Never Type

Seok·2021년 5월 13일
1

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타입 조차 할당될 수 없음을 알리고 있다.

Exhaustive Checks

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

profile
🦉🦉🦉🦉🦉

0개의 댓글