inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

타입 단언

Non Null 타입 질문

해결된 질문

206

쟁쟁

작성한 질문수 3

0

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

let post: Post = {
  title: "한입",
  author: "이정한",
};

const len: number = post.author!.length;

console.log(len);

안녕하세요 강의를 듣다가 질문이 있어서 남깁니당

Non Null 타입은 선택적 프로퍼티에 값이 존재할 때만 사용할 수 있는건가요? post 객체에 author 프로퍼티를 정의하지 않고 파일을 실행하니 오류가 납니다!

typescript

답변 2

1

이정환 Winterlood

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

우선 Non null 단언(!)은 해당 값이 null이나 undefined이 아님을 우리 "개발자들이 보증한다" 라는 의미의 문법입니다. 타입 검사 단계에서 일종의 눈속임을 하는거죠

따라서 person!.age 처럼 사용하면, 실제로 person 객체에 age 프로퍼티가 없더라도 TypeScript는 컴파일 단계에서 오류를 발생시키지 않습니다.

그러나 런타임 오류는 동일하게 발생합니다. person 객체에 age 프로퍼티가 존재한다고 눈속임 하였으나, 실제로 코드가 실행되었을 때(런타임에) person에 age 프로퍼티가 없기 때문에 실행하면 오류가 발생하게 되는 것 입니다.

 

PS. AI 인턴도 좋은 답을 남겨주었으니 참고해보시면 좋을 것 같아요

0

인프런 AI 인턴

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

쟁쟁님의 질문에 대해 답변드리겠습니다. Non-null assertion(!)은 TypeScript에서 해당 값이 null 또는 undefined가 아님을 단언하는 연산자입니다. 즉, 해당 값이 확실히 null 또는 undefined가 아닐 때 사용하여 타입 체커에게 해당 값을 null이나 undefined로 간주하지 않도록 할 수 있습니다.

선택적 프로퍼티(author?)에 대한 질문에서, 값이 있을 때만 non-null assertion을 사용할 수 있는지에 대해 질문하셨는데, 이는 실제 값의 존재 여부와 관계없이 사용할 수 있습니다. 하지만 값을 사용하는 시점에 실제로 null 또는 undefined일 경우 런타임 오류가 발생할 수 있으므로 주의가 필요합니다.

구체적으로 post.author!.length에서 non-null assertion을 사용하는 경우, post.author 값이 실제로 있음을 단언하는 것이기 때문에 TypeScript 컴파일러는 오류를 발생시키지 않습니다. 그러나 실제 런타임에 해당 프로퍼티가 없다면(undefined) JavaScript 오류가 발생합니다.

당신의 코드 예제에서 author 프로퍼티가 선택적으로 지정되어 있고, 실제로 값을 제공하지 않았을 때 non-null assertion을 사용하면, 런타임에서 Cannot read property 'length' of undefined와 같은 오류가 나게 됩니다.

다음은 비슷한 주제에 대해 질문하셨던 다른 수강생의 질문과 지식공유자의 답변 링크입니다:

이정환 강사님의 답변에 따르면, author 프로퍼티가 undefined일 수도 있다고 명시해두었기 때문에 자동으로 Optional Chaining (?.)을 걸어주는 것이 일반적입니다. 이는 코드나 환경설정의 문제가 아니라, author가 선택적 프로퍼티이기 때문입니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

제네릭 클래스 핸드북 페이지가 undefined라고 나옵니다.

0

25

2

적절한 타입 찾기 React.ChangeEvent<HTMLInputElemen>

0

35

2

outDir 옵션 추가 후 컴파일 오류 질문

0

74

1

호출 시그니처 질문

0

70

2

서로소 유니언 타입이 discriminated union과 동의어 인가요?

0

82

2

조건부타입소개 중 함수오버로딩 활용 시 인수의타입과 함수의 반환값의 타입이 깨지는 문제

0

72

1

할인쿠폰 관련하여

0

166

2

프론트엔드에서의 인터페이스활용

0

97

2

안녕하세요 이정환님!

0

96

1

Node.js 설치에 관한 질문입니다.

0

82

2

함수 타입 호출 시그니처

0

62

1

35강. 모듈 보강은 라이브러리 파일을 직접 편집해야 하나요?

0

69

2

인터페이스 문법이 있는데 타입 별칭 문법은 왜 있나요?

0

122

4

마우스 호버 시 정보

0

97

2

vite으로 리액트 빌드하기를 업데이트해주세요.

1

91

2

타입가드를 만들어 사용하는 이유가 궁금합니다.

0

87

2

섹션 12가 너무 어려운데... 정상이겠죠..?

0

141

2

선생님.. 알고리즘도 강의해주시면안되나요

0

105

2

선생님은 어떻게 이런걸 아세요?

0

136

1

type: module

0

102

2

7:17초 업캐스팅 질문이있습니다!

0

81

1

슈퍼타입질문

1

68

2

프로젝트 설치

0

113

2

enum은 비원시 타입이면서 열거형 타입이 되는건가요?

0

74

2