강의

멘토링

커뮤니티

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

khhan1990님의 프로필 이미지
khhan1990

작성한 질문수

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

타입 단언

Non Null 단언에서 이해가 어려운 부분이 있습니다.

해결된 질문

작성

·

121

·

수정됨

0

안녕하세요!
수업 잘 듣고 있습니다.
강의를 듣던 중 이해가 어려운 부분이 있어서 질문글을 씁니다.

강의에서 예를 드신 경우처럼

익명 게시판을 만들기 위해 author 객체의 값이 들어갈 수도 안 들어갈 수 있으니 author를 optional property로 사용한 것인데, 만약 어떤 사용자가 익명이라 author값이 들어가지 않았을 때 Non null 단언을 사용하는 것인지 궁금합니다.

type Post = {
  title: string;
  author?: string;
};

let post: Post = {
  title: "게시글1",
  author: "khhan",
};

const len: number = post.author!.length;
console.log(len)

post.author의 값이 안 들어갔을 경우 optional chaining을 사용하게 되면 오류가 발생하니 Non null 단언을 사용하여 오류를 해결한다 해도, 실제 런타임에서는 오류가 발생하는 것인데, 이렇게 되면 왜 Non null을 굳이 써야하는 것인가? 하는 의문점이 듭니다.

감사합니다^^

 

답변 2

0

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

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

우선 잘 알고 계시겠지만 한번 정리하자면, 타입스크립트의 모든 단언문은(Non null 단언을 포함하여) 강의에서도 한번 말씀드렸듯이 그저 타입스크립트 컴파일러를 눈속임 하는 기능으로, 타입 안정성을 보장하지 않습니다. 그러므로 런타임에서의 동작을 보장하지는 않습니다.

그러므로 TypeScript의 Non null 단언은 자주 사용되는 단언문은 아닙니다. 보여드린 예제 코드처럼 언제든 런타임 및 타입 에러를 발생시킬 수 있기 때문입니다. 보통은 우리가 직접 정의하지 않은 외부 라이브러리나 API에서 제공하는 타입이 잘못 되었거나 또는 호환이 맞지 않는 경우 종종 활용됩니다.

대표적인 예시로는 DOM API가 있습니다. document.querySelector 라는 메서드는 nullable(null일 수도 있는) 타입의 값을 반환하는데요, null이 아닐거라고 확신하고 작업을 수행해야 할 경우 다음과 같이 코드를 작성할 수도 있습니다.

document.querySelector('.classname')!.innerHTML
khhan1990님의 프로필 이미지
khhan1990
질문자

잘 확인했습니다 감사합니다:)

0

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

khhan1990님께서 질문주신 내용은 TypeScript에서의 Non-Null 단언 연산자와 관련된 질문입니다. Non-Null 단언 연산자 !는 개발자가 해당 값이 null이나 undefined가 아님을 확신하고 있음을 TypeScript 컴파일러에게 알려주는 기능을 가지고 있습니다. 그러나 실제로 런타임에서 null이나 undefined가 발생할 경우 TypeScript가 아닌 JavaScript 런타임에서 오류가 발생하게 됩니다.

이런 경우에는 몇 가지 상황에서 Non-Null 단언을 사용할 수 있습니다:
1. 값이 반드시 있는 상황임이 보장되는 경우, 그런데 이러한 상황을 컴파일러가 알지 못할 때 사용합니다.
2. 외부 라이브러리와의 연동이나 협업 프로젝트에서 타입 정의가 완전히 일치하지 않는 경우에 잠시 사용할 수 있습니다.

그러나 중요한 것은, 코드를 작성할 때 Non-Null 단언 대신 철저하게 에러 처리 또는 옵셔널 체이닝을 통해 좀 더 안전한 코드를 작성하는 것이 좋습니다. 예를 들어 author가 분명히 존재할 때만 length를 호출하도록 if 문 등을 사용해 조건을 검증하는 방법이 있습니다.

아래와 같은 방식으로 안전하게 작성할 수 있습니다:

if (post.author) {
  const len: number = post.author.length;
  console.log(len);
} else {
  console.log('Author 정보가 없습니다.');
}

이처럼 조건 검사를 추가하면 런타임 오류를 예방할 수 있습니다.

더 관련된 질문을 원하시면 관련 자료를 찾아보실 수 있습니다:
- 섹션3 타입단언 Non Null단언 예제코드 작성 중 질문사항 있습니다. - 질문 방식으로 Non-Null 단언을 사용하는 상황에 대한 설명이 포함되어 있습니다.

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

khhan1990님의 프로필 이미지
khhan1990

작성한 질문수

질문하기