728x90
반응형
유니온 타입(Union Type)이란?
자바스크립트의 OR 연산자(||)와 같이 A이거나 B이다 라는 의미의 타입
하나의 변수나 함수가 여러 개의 타입을 가질 수 있게 하는 기능이다.
function getData(value: string | number) {
// ...
}
유니온 타입 쓰는 이유
코드의 안정성과 가독성을 높이기 위해서이다.
아래와 같이 any 타입을 사용하는 경우 타입스크립트의 타입 추론 기능을 상실하게 되어 코드 작성 중 실수를 쉽게 잡아내지 못할 수 있다. 반면 유니온 타입을 사용하면 특정 타입에 대해 명확한 조건 검사를 통해 타입 안전성을 유지할 수 있다.
// any를 사용하는 경우
function getData(value: any) {
value.toFixe(); // 에러 발생, age의 타입이 any로 추론되기 때문에 숫자 관련된 API를 작성할 때 코드가 자동 완성되지 않는다.
return value;
}
// 유니온 타입을 사용하는 경우
function getData(value: number | string) {
if (typeof value === 'number') {
value.toFixed(); // 정상 동작, value의 타입이 `number`로 추론되기 때문에 숫자 관련된 API를 쉽게 자동완성 할 수 있다.
return value;
}
if (typeof value === 'string') {
return value;
}
return new TypeError('value must be number or string');
}
유니온 타입과 인터페이스 사용 시 주의할 점
interface Person {
name: string;
age: number;
}
interface Developer {
name: string;
skill: string;
}
function introduce(someone: Person | Developer) {
console.log(someone.name); // O 정상 동작
console.log(someone.age); // X 타입 오류
console.log(someone.skill); // X 타입 오류
}
introduce 함수의 파라미터 타입을 Person과 Developer 인터페이스의 유니온 타입으로 정의했다.
유니온 타입은 "A도 될 수 있고 B도 될 수 있는" 타입이기 때문에, 함수 안에서 모든 속성을 사용할 수 있을 것 같지만, 타입스크립트는 Person 타입일지 Developer 타입일지 알 수 없으므로 공통 속성인 name만 접근할 수 있다.
해결방안
따라서 introduce 함수 안에서는 타입 가드(Type Guard)를 이용하여 타입의 범위를 좁혀야한다.
function introduce(someone: Person | Developer) {
if ('age' in someone) {
console.log(someone.age); // O 정상 동작
}
if ('skill' in someone) {
console.log(someone.skill); // O 정상 동작
}
}
유니온 타입을 사용할 때 타입 가드를 통해 타입의 범위를 좁히는 것은 매우 중요하다.
이를 통해 타입스크립트의 타입 시스템을 최대한 활용하고 코드의 안정성을 높일 수 있다.
728x90
반응형
'TypeScript' 카테고리의 다른 글
[TS] 컴파일러, 그리고 tsc와 tsconfig.json (0) | 2024.09.07 |
---|---|
[TS] TypeScript 왜 배워야 할까? (2) | 2024.09.06 |
[TS] 옵셔널 체이닝(optional chaining) (0) | 2024.07.27 |
[TS] 객체의 선택적 속성(optional property, 옵셔널 프로퍼티) (0) | 2024.07.24 |