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

유니온과 리터럴 타입

둘 중 하나만 담기게 하고, 정해진 값만 담기게 합니다.

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

둘 중 하나만 담기게 합니다

값이 언제나 한 가지는 아닙니다. 아이디가 글자일 때도 숫자일 때도 있습니다. 세로줄로 이어 적으면 그중 하나가 담길 수 있다는 뜻이 됩니다.

let id: string | number;

이것을 유니온이라고 합니다. 몇 개를 이어도 됩니다.

main.ts
let id: string | number;

id = "a-1";
console.log(id);

id = 1;
console.log(id);
출력
a-1 1
main.ts
let id: string | number;

id = true;
출력
3:1 TS2322 'boolean' 형식은 'string | number' 형식에 할당할 수 없습니다.
상세 사용법

정해진 값만 담기게 하기 — 리터럴 타입

1.2 에서 const 의 타입이 그 값 하나로 좁혀지는 것을 보았습니다. 값을 그대로 타입으로 적을 수 있습니다. 그것을 유니온으로 이으면 정해진 몇 가지만 담기게 됩니다.

main.ts
type Level = "low" | "mid" | "high";

let level: Level = "mid";
console.log(level);

level = "middle";
출력
6:1 TS2322 '"middle"' 형식은 'Level' 형식에 할당할 수 없습니다.

오타가 그대로 잡힙니다. JavaScript 였다면 "middle" 이 그냥 담기고, 그 값으로 갈라지는 코드가 조용히 어긋났을 것입니다.

type Level = … 이 타입에 이름을 붙이는 문법입니다. 2.4 에서 자세히 봅니다.

상세 사용법

유니온에서는 공통된 것만 사용할 수 있습니다

main.ts
function show(id: string | number) {
	console.log(id.toUpperCase());
}

show("a-1");
출력
2:17 TS2339 'string | number' 형식에 'toUpperCase' 속성이 없습니다. 'number' 형식에 'toUpperCase' 속성이 없습니다.

show("a-1") 로만 불렀는데도 막혔습니다. 타입 검사는 부르는 자리를 보지 않고 함수만 봅니다. 숫자가 들어올 수 있다고 적어 두었으니, 숫자일 때도 되는 코드여야 합니다.

그래서 유니온을 받으면 어느 쪽인지 확인해서 좁혀야 합니다. 그 방법이 2.5 타입 좁히기입니다. 아래에 미리 한 가지만 봅니다.

main.ts
function show(id: string | number) {
	if (typeof id === "string") console.log(id.toUpperCase());
	else console.log(id + 1);
}

show("a-1");
show(1);
출력
A-1 2
흔한 실수

처음에 자주 걸리는 것

유니온을 넓게 잡으면 쓸 수 있는 것이 줄어듭니다

담길 수 있는 것을 늘릴수록 공통된 것만 남습니다. 되도록 좁게 적는 편이 다루기 쉽습니다.

배열에 붙일 때는 괄호가 필요합니다

string | number[] 는 "글자 또는 숫자 배열" 입니다. "글자나 숫자가 담긴 배열" 은 (string | number)[] 로 적습니다.

리터럴 타입은 let 에서 넓어집니다

let level = "mid"; 의 타입은 string 입니다. 정해진 값만 담으려면 : Level 처럼 적어 두어야 합니다.

실습 문제

직접 해보기

1. 상태 값 묶기 난이도 하

"pending""done" 만 담기는 타입을 만들고, 두 값을 차례로 넣어 출력하세요.

type Status = "pending" | "done";

let status: Status = "pending";
console.log(status);

status = "done";
console.log(status);
2. 길이 재기 난이도 중

글자나 배열을 받아 길이를 돌려주는 함수를 만드세요. 둘 다 length 를 가지고 있습니다.

function size(value: string | unknown[]): number {
	return value.length;
}

console.log(size("홍길동"));
console.log(size([1, 2, 3, 4]));
요약

이 단원의 정리

  • 세로줄로 이으면 그중 하나가 담길 수 있다는 뜻입니다.
  • 값을 그대로 타입으로 적을 수 있습니다(리터럴 타입).
  • 리터럴을 유니온으로 이으면 정해진 값만 담기게 됩니다.
  • 유니온에서는 모두가 가진 것만 사용할 수 있습니다.
  • 어느 쪽인지 확인해서 좁히면 그쪽 것을 사용할 수 있습니다.