강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

Next님의 프로필 이미지
Next

작성한 질문수

한 입 크기로 잘라먹는 타입스크립트(TypeScript)

타입 계층도와 함께 기본타입 살펴보기

never 타입 질문드립니다.

해결된 질문

작성

·

92

·

수정됨

0

섹션 4 > 타입 계층도와 함께 기본타입 살펴보기 강의 수강 중
never타입에 대해 궁금한 점이 있어 질문드립니다.

 

아래와 같이 neverVar라는 변수를 만들어서 never타입을 할당하였는데 numVar에 neverFunc() 를 넣었을 때는 오류가 발생하지 않는데 neverVar를 넣었을 때는 오류가 발생합니다.

같은 never타입을 넣었고, 업캐스팅이 되고 있는데 오류가 발생하는 이유가 궁금합니다.

const neverExam = () => {
  let neverVar: never;

  const neverFunc = (): never => {
    while (true) {}
  };

  let numVar: number = neverFunc();
  let numVar2: number = neverVar; // 오류 발생
};

답변 2

1

이정환 Winterlood님의 프로필 이미지
이정환 Winterlood
지식공유자

안녕하세요 이정환입니다.

우선 말씀하신 코드의 해당 오류는 다음 그림과 같이 타입 호환성 때문에 발생한 에러가 아닌, 변수가 할당되기 전에 사용되어서 발생하는 오류입니다.

image.png

따라서 정확한 동작을 확인하시려면 다음 그림과 같이 neverVar 변수의 값을 null as never(never 타입으로 단언된 null값)으로 할당하신 다음 사용하시면 될 것 같습니다!

image.png

 

0

안녕하세요, 인프런 AI 인턴입니다.

never 타입에 대한 궁금증을 해결하시길 희망하며 설명드리겠습니다.

never 타입은 TypeScript에서 항상 오류를 나타내거나 함수의 실행을 종료시키는 함수의 반환 타입으로 사용됩니다. 이는 함수가 정상적으로 값을 반환하지 않음을 의미합니다. 주로 무한 루프나 오류를 던지는 함수와 같이 일반적인 반환 경로가 없는 경우에 사용됩니다.

현재 질문에 주신 코드에서는 neverFunc() 함수가 never 타입으로 선언되어 있으며, 이는 명확히 무한 루프를 가지고 있으므로 실제로 값을 반환하지 않을 것입니다. 따라서 neverFunc()를 호출하여 numVar에 할당하는 것은 TypeScript가 never 타입을 number 타입에 할당할 수 있도록 컴파일러에서 허용합니다. 사실, 실행하지 않으므로 변수 numVar에 실제 값이 할당되지 않는다는 의미이기도 합니다.

반면에, neverVar 변수는 명시적으로 never 타입으로 선언되었지만, 초기화되지 않습니다. TypeScript는 never 타입으로 선언된 변수를 초기화 없이 사용할 수 없도록 합니다. never 타입의 변수는 어떠한 값도 가질 수 없음을 의미하기 때문에, 이 변수에 대한 접근은 컴파일 단계에서 오류를 발생시킵니다.

요약하자면, neverFunc() 호출 결과는 타입 시스템적으로 never로 간주되어 허용되지만, 직접적으로 never 타입 변수를 사용하려고 하면 오류가 발생합니다.

관련 내용을 더 깊이 이해하고 싶으시다면, 다음 링크를 참고하실 수 있습니다:
- 타입스크립트의 never 타입 이해하기

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Next님의 프로필 이미지
Next

작성한 질문수

질문하기