대수 타입
대수 타입이란 여러 개의 타입을 조합하여 새로운 타입을 만드는 방식을 말한다.
대표적으로 Union 타입(합집합)과 Intersection(교집합) 타입이 있다.
Union 타입은 여러 타입 중 하나만 해당하면 되는 타입을 의미한다.
즉, A | B는 A이거나 B일 수 있지만, 둘 다일 수도 있다. (둘 다 포함할 필요는 없다.)
A | B는 A 또는 B 중 하나의 형태를 가지면 된다.A의 속성만 가져도 되고, B의 속성만 가져도 된다.let a: string | number | boolean;
a = 1; // number ✅
a = "hello"; // string ✅
a = true; // boolean ✅
let arr: (number | string | boolean)[] = [1, "hello", true]; // ✅ 가능
객체 타입에서 A | B는 A 또는 B 형태일 수 있지만, 반드시 모든 속성을 가질 필요는 없다.
type Dog = {
name: string;
color: string;
};
type Person = {
name: string;
language: string;
};
type Union1 = Dog | Person;
// Dog 타입 (가능)
let union1: Union1 = {
name: "꽝꽝이",
color: "white",
};
// Person 타입 (가능)
let union2: Union1 = {
name: "띠닝",
language: "Korean",
};
// Dog & Person 타입 (가능)
let union3: Union1 = {
name: "두식이",
color: "black",
language: "English",
};
// 오류 발생 (name은 공통 속성이지만 color 또는 language가 없다.)
let union4: Union1 = {
name: "", // ❌ 오류
};
Union1 타입은 Dog 또는 Person 중 하나의 타입을 가져야 한다.union3처럼 모든 속성을 포함하는 것도 가능하다. (필수 ❌)union4는 name만 있고 color나 language가 없으므로 오류가 발생한다.Intersection 타입은 모든 타입(두 개 이상)의 속성을 합친 새로운 타입을 만든다.
즉, A & B는 A와 B의 모든 속성을 가져야 하는 타입이다.
A & B는 A와 B의 모든 속성을 포함해야 한다.let variable: number & string; // ❌ never 타입
number & string이 never인 이유number와 string을 동시에 만족하는 값은 존재할 수 없다.number & string은 never 타입이 된다.type Dog = {
name: string;
color: string;
};
type Person = {
name: string;
language: string;
};
type Intersection = Dog & Person;
// Dog와 Person의 모든 속성을 포함해야 한다.
let intersection1: Intersection = {
name: "꽝꽝이",
color: "white",
language: "Korean",
};
// 오류 발생 (color 또는 language가 없으므로 불완전한 객체)
let intersection2: Intersection = {
name: "두식이",
color: "black",
}; // ❌ 오류
Intersection 타입은 Dog와 Person의 속성을 모두 포함해야 한다.Union과 다르게 선택적이 아니라 필수적으로 모든 속성이 있어야 한다.