TS LAB
TS 1.6 · 1부. 타입 기초

null 과 undefined

값이 없을 수 있다는 것을 타입에 적고, 확인해야 사용하게 합니다.

예상 학습 시간 16분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 입문
개념 설명

값이 없을 수 있다는 것도 타입입니다

JavaScript 에서 가장 자주 만나는 오류가 Cannot read properties of null 입니다(JS 7.1). 값이 있다고 여기고 다뤘는데 없었던 것입니다.

TypeScript 는 없을 수 있다는 것을 타입에 적게 합니다. 그러면 확인하지 않고 사용하는 코드를 미리 막습니다.

let name: string;          // 언제나 글자입니다
let name: string | null;   // 글자이거나, 없습니다
최소 예제 · 편집 가능

확인하지 않으면 막힙니다

main.ts
function show(name: string | null) {
	console.log(name.length);
}

show("홍길동");
출력
2:14 TS18047 'name'은(는) 'null'일 수 있습니다.

이것이 TypeScript 를 쓰는 가장 큰 까닭 가운데 하나입니다. 실행하기 전에, 그것도 값이 실제로 없어지기 전에 막습니다.

main.ts
function show(name: string | null) {
	if (name !== null) console.log(`${name} (${name.length}글자)`);
	else console.log("이름이 없습니다");
}

show("홍길동");
show(null);
출력
홍길동 (3글자) 이름이 없습니다

if 안쪽에서는 null 이 빠져 string 만 남습니다. 그래서 name.length 가 됩니다.

상세 사용법

없을 수도 있는 속성 — 물음표

객체의 속성에 ? 를 붙이면 없어도 되는 것이 됩니다. 그 값의 타입에는 undefined 가 함께 담깁니다.

main.ts
type User = { name: string; nickname?: string };

const a: User = { name: "홍길동", nickname: "길동" };
const b: User = { name: "김철수" };

console.log(a.nickname?.length);
console.log(b.nickname?.length);
console.log(b.nickname ?? "별명 없음");
출력
2 undefined 별명 없음

?.?? 는 JavaScript 문법 그대로입니다(JS 6.5). TypeScript 는 그것을 언제 써야 하는지를 알려 줍니다 — 붙이지 않으면 위처럼 오류가 납니다.

상세 사용법

화면에서 요소를 찾을 때

querySelector 는 찾지 못하면 null 을 돌려줍니다. 그래서 타입이 Element | null 입니다.

main.ts
const box = document.querySelector("#box");

box.textContent = "안녕하세요";
출력
3:1 TS18047 'box'은(는) 'null'일 수 있습니다.

JavaScript 에서 오타 하나로 화면이 조용히 멈추던 자리가 바로 여기였습니다. 확인하고 다루면 됩니다.

main.ts
const box = document.querySelector("#box");

if (box !== null) {
	box.textContent = "안녕하세요";
	console.log(box.textContent);
}
else {
	console.log("그런 요소가 없습니다");
}
출력
안녕하세요
흔한 실수

처음에 자주 걸리는 것

느낌표로 넘기는 것

box!.textContent 처럼 ! 를 붙이면 "없을 리 없다" 고 알리는 것이라 오류가 사라집니다. 확인한 것이 아니라 검사를 끈 것이라, 실제로 없으면 그대로 터집니다.

null 과 undefined 는 다릅니다

null없다고 정한 것, undefined아직 넣지 않은 것입니다. 타입에도 따로 적습니다. ? 로 만든 선택 속성에는 undefined 가 담깁니다.

설정을 끄면 이 검사가 사라집니다

strictNullChecks 를 끄면 모든 타입에 null 이 담길 수 있게 되어 이 단원의 오류가 하나도 나지 않습니다. 켜 두는 것이 기본값입니다(4.1).

실습 문제

직접 해보기

1. 없을 때의 인사말 난이도 하

이름이 없을 수도 있는 함수를 만들고, 없으면 "손님, 안녕하세요" 를 돌려주세요.

function greet(name: string | null): string {
	if (name === null) return "손님, 안녕하세요";
	return `${name} 님, 안녕하세요`;
}

console.log(greet("홍길동"));
console.log(greet(null));
2. 한 줄로 줄이기 난이도 중

위 함수를 ?? 로 한 줄로 줄여 보세요.

function greet(name: string | null): string {
	return `${name ?? "손님"} 님, 안녕하세요`;
}

console.log(greet("홍길동"));
console.log(greet(null));
요약

이 단원의 정리

  • 없을 수 있는 값은 string | null 처럼 적습니다.
  • 확인하지 않고 사용하면 실행하기 전에 막힙니다.
  • if 로 확인한 안쪽에서는 없는 경우가 빠집니다.
  • 속성에 ? 를 붙이면 없어도 되는 것이 됩니다.
  • ! 는 확인이 아니라 검사를 끄는 것입니다.