TypeScript 시작하기 (14) - 함수에 사용하는 never 타입도 있긴 합니다

funfungun·2025년 1월 13일
0

TypeScript 시작하기

목록 보기
14/18
post-thumbnail

지난 시간에는 narrowing 할 수 있는 방법을 더 알아보았습니다. 이번 시간에는 함수에 사용하는 never 타입에 대해 자세히 알아보겠습니다.


  1. 함수의 return 값에 붙일 수 있는 것이 never type인데, 첫 번째 조건은 함수에 return 값이 없어야 합니다.
    function practice(): never {
      return 1; //error 'number' 형식은 'never' 형식에 할당할 수 없습니다.ts(2322)
    }

  1. 두 번째 조건은 함수가 끝나지 않아야, 즉 endpoint 가 없어야합니다. 첫 번째 조건과 거의 같은 말인데, 사실 return 값을 명시해주지 않으면 undefined 가 반환되는 구문이 숨겨져 있습니다.
    function practice(): never {
      return undefined; //error
    }

  1. endpoint 가 없는 함수는 뭐냐면, 다음의 예처럼 강제로 에러를 던졌을 때, 실행이 중단되지만 끝난 것은 아닌 경우에 never 타입을 가질 수 있습니다.
    function practice(): never {
      throw new Error();
    }

  1. 사실 never 타입은 void 로 대체하면 되기 때문에 쓸모가 없지만, never 타입이 등장하는 것은 코드를 잘못 짠 경우입니다. 아래처럼 잘못된 narrowing 을 하는 경우처럼, narrowing 이 사실상 필요 없는 경우 else 구문이 실행될 일이 없어서 never 가 됩니다.
    function practice(parameter: string) {
      if (typeof parameter === "string") {
        console.log(parameter); // (parameter) parameter: string
      } else {
        console.log(parameter); // (parameter) parameter: never
      }
    }

  1. 또한, 어떤 함수표현식은 return 타입이 자동으로 never 입니다. 아래 코드처럼 함수가 있던 자리에 아무것도 안 남기 때문에 그렇습니다.
    let practice = function () { // let practice: () => never
      throw new Error();
    };

  1. 별개로 tsconfig.json 에서 strict 옵션을 켜둘 경우 함부로 any 타입을 지정해주지 않는 경우가 있습니다. 그럴 때 array 같은 것에 타입 지정을 안하고 만들면 원래는 any[] 이런 타입이 되어야하지만, any 를 가질 수 없으니 never[] 과 같은 타입이 발견되기도 합니다.
    let arr = [];

지금까지 never 에 대해서 알아보았습니다. 사실상 쓸 일이 별로 없기 때문에 이럴 때도 등장한다고 알아두기만 하면 됩니다.

profile
Commercial Art

0개의 댓글