반응형
1. Union Type
유니온 타입(Union Type)이란 자바스크립트의 OR 연산자(||)와 같이 A이거나 B이다라는 의미의 타입입니다. 아래 코드를 보겠습니다.
function logText(text: string | number) {
// ...
}
위 함수의 파라미터 text에는 문자열 타입이나 숫자 타입이 모두 올 수 있습니다. 이처럼 | 연산자를 이용하여 타입을 여러 개 연결하는 방식을 유니온 타입 정의 방식이라고 부릅니다.
Union Type의 장점
// # Union 타입 문법 - `any` 보다는 명시적임
function logMessage(value: string | number) {
console.log(value);
}
function logMessage(value: string | number) {
if (typeof value === "string") {
value.toFixed(); //error
value.toLocaleUpperCase();
}
if (typeof value === "number") {
value.toFixed();
value.toLocaleUpperCase(); //error
}
throw new TypeError("value must be string or number");
}
- any타입보다는 명시적입니다
- 해당 타입에 맞는 메서드를 타입 시스템 단에서 걸러낼 수 있습니다.
Union Type 특징
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
function askSomeone(someone: Developer | Person) {
someone.name; // O
someone.age; // X
if ("skill" in someone) {
someone.skill; // O
}
if ("age" in someone) {
someone.age; // O
}
}
askSomeone({name:'test1', skill:'a'}) //ok
askSomeone({name:'test2', age:20}) //ok
askSomeone({name:'test3', skill:'a', age:20}) //ok
- 위 코드 처럼 두 개의 Interface를 Union Type으로 지정하면 공통된 name만 타입이 통과하고 skill과 age는 타입 에러가 발생합니다.
- Union Type은 내부 속성에 접근할 때 A이거나 B이다 일뿐 A와B 모두를 의미하는 합집합(OR) 성질이 아닙니다.
- 타입스크립트 관점에서는 askSomeone() 함수를 호출하는 시점에 Person타입이 올지 Developer타입이 올지 알 수가 없기 때문에 어느 타입이 들어오든 간에 오류가 안 나는 방향으로 타입을 추론하게 되어 name만 타입에러가 안나는 것입니다.
2. Intersection Type
interface Developer {
name: string;
skill: string;
}
interface Person {
name: string;
age: number;
}
function askSomeone(someone: Developer & Person) {
someone.name; // O
someone.age; // O
someone.skill; // O
}
askSomeone({name:'test1', skill:'a'}) //error
askSomeone({name:'test2', age:20}) //error
askSomeone({name:'test3', skill:'a', age:20}) //ok
- Union Type에서 만들지 못한 A와 B 모두를 의미하는 합집합(OR) 성질을 만들고 싶을 때 사용하면 좋습니다.
- 인터섹션 타입은 다양한 상황에서 유용하게 사용될 수 있습니다. 예를 들어, 여러 객체를 조합하여 새로운 객체를 생성해야 할 때, 다른 타입 간의 공통 속성을 추출하여 결합해야 할 때, 또는 다른 타입을 확장하여 새로운 타입을 만들어야 할 때 인터섹션 타입을 사용할 수 있
반응형
'기억보단 기록을 > Typescript' 카테고리의 다른 글
[Typescript] Section 08. Class (0) | 2023.05.20 |
---|---|
[Typescript] Section 07. Enum (0) | 2023.05.20 |
[Typescript] Section 05. 타입 별칭, Type vs Interface (0) | 2023.05.20 |
[Typescript] Section 04. 인터페이스 (0) | 2023.05.20 |
[Typescript] Section 03. 기본타입 (0) | 2023.05.20 |