Union
TypeScript의 Union(유니온) 타입은 둘 이상의 타입을 허용하도록 하는 타입으로, 여러 종류의 값을 가질 수 있는 변수를 선언할 때 유용합니다. 유니온 타입은 '|' 기호를 사용하여 표시할 수 있습니다.
예를 들어, 다음과 같이 유니온 타입을 사용할 수 있습니다.
let val: number | string; // number 또는 string을 가질 수 있는 변수 선언
val = 123; // 숫자 할당
console.log(val); // 123
val = "hello"; // 문자열 할당
console.log(val); // hello
위 예시에서 'val' 변수는 number 또는 string 타입을 가질 수 있습니다.
이를 통해 여러 가지 타입의 값을 단일 변수에 할당하여 유연성을 확보할 수 있습니다.
만약 다른 타입의 값을 넣으면 에러를 확인할 수 있습니다.
예를 들어 string 또는 boolean 타입을 가질 수 있는 타입을 선언해 보겠습니다.

이때 undefined을 넣어주면 에러가 발생합니다.
Type 'undefined' is not assingnable to type 'StringOrBooleanType'

메시지 그대로 undefined 타입이 StringOrBooleanType이라는 사용자 지정 타입에 할당될 수 없다는 것을 의미합니다.
그리고 들어갈 수 있는 글자들을 지정할 수도 있습니다.
type StateTypes = 'DONE' | 'LOADING' | 'ERROR';
let state: StateTypes = 'DONE';
state = 'LOADING';
만약 다른 글자가 들어가게 된다면 아래와 같이 에러를 확인할 수 있습니다.

메시지 그대로 'INITIAL'이라는 스트링 값은 StateTypes에 존재하지 않는다 라는 에러가 나는 것을 확인할 수 있습니다.
이렇게 여러 개의 값들을 입력할 수 있고 이외의 값들은 입력할 수 없도록 만들 수 있습니다.
List Union
리스트 유니온은 배열과 같은 리스트 구조에 다양한 유형의 값을 포함할 수 있도록 합니다.
예를 들어 string 리스트 또는 boolean 리스트 타입을 정의해 보겠습니다.
type StringListOrBooleanList = string[] | boolean[];
let strListOrBooleanList: StringListOrBooleanList = [
'잘자세연',
'안녕하세연',
'누구세연',
]
strListOrBooleanList = [
true,
false,
false,
true,
]
이처럼 string 값을 여러 개 넣어줄 수 있고, boolean값도 여러 개 넣어줄 수 있습니다.
하지만 여기에서 string과 boolean이 함께 있는 리스트는 정의할 수 없습니다.

Type '(string | true)[]' is not assignable to type 'StringListOrBooleanList'
이러한 에러가 나타납니다.
만약 두 개의 타입이 동시에 존재하는 리스트를 구현하고자 한다면 다음과 같이 정의해야 합니다.
type StrOrNumberList = (string | number)[];
let stringOrNumberList = [
1, 2, 3,
'잘자세연',
'누구세연',
];
stringOrNumberList = [
1,2,3
]
stringOrNumberList = [
'잘자세연', '누구세연',
]
Interface로 사용하는 Union
인터페이스를 사용하여 유니온을 정의할 수도 있습니다. 이를 통해 인터페이스로 다양한 유형을 처리하는 객체를 생성할 수 있습니다.
예를 들어, 다음과 같이 유니온을 사용하는 인터페이스를 정의할 수 있습니다.
Animal 인터페이스를 정의하고 Human 인터페이를 정의합니다.
그 후에 AnimalOrHuman 타입을 선언해 줍니다.
interface Animal{
name: string;
age: number;
}
interface Human {
name: string;
age: number;
address: string;
}
type AnimalOrHuman = Animal | Human;
Human 타입을 가정하고 입력해 보겠습니다.
let animalOrHuman: AnimalOrHuman = {
name: '누구세연',
age: 25,
address: '대한민국',
}
console.log(animalOrHuman);
console.log(animalOrHuman.name);
console.log(animalOrHuman.age);
console.log(animalOrHuman.address);

저장하고 실행하면 입력한 값이 잘 출력되는 것을 확인할 수 있습니다.

근데 이 animalOrHuman에 마우스를 올려보면 AnimalOrHuman 타입이 아니고 Human 타입으로 인식되는 것을 확인할 수 있습니다.
TypeScript가 추론을 해서 정의가 된 것입니다.
Animal 타입을 가정하고 정의해 보겠습니다.
animalOrHuman = {
name: '오리',
age: 9,
}
console.log(animalOrHuman);
console.log(animalOrHuman.name);
console.log(animalOrHuman.age);
Human 타입과 동일하게 잘 출력되는 것을 확인할 수 있습니다.


이 animalOrHuman도 Animal 타입으로 인식되는 것을 확인할 수 있습니다.
둘의 차이는 address라는 주소가 있는지 없는지의 차이입니다.
이거를 TypeScript는 제대로 인지를 하고 유추를 정확하게 합니다.
유니온은 TypeScript의 강력한 기능 중 하나로, 다양한 유형의 값을 다룰 때 유용하게 사용할 수 있습니다.
'Backend > TypeScript' 카테고리의 다른 글
| [TypeScript] Narrowing(내로잉) (1) | 2023.11.27 |
|---|---|
| [TypeScript] Intersection (2) | 2023.11.10 |
| [TypeScript] Casting (캐스팅) (0) | 2023.11.08 |
| [TypeScript] Type Interface (타입 유추하기) (0) | 2023.11.05 |
| [TypeScript] Enum (0) | 2023.11.03 |