Studying/TypeScript
TypeScript- 대수 타입
creamymood
2025. 6. 9. 15:42
union이랑 intersection은 합집합과 교집합으로 이해 하면 된다!
Union : 합집합
union 하나하나 내부의 속성이 다있는게 합집합이 아니라..
A에도 속할 수 있고, B에도 속할 수 있고, 둘 다 에도 속할 수 있는 모든게 union.
처음에 혼자 공부할 때는,
(...)
let union1: Union1 = { // ✅
name: "",
color: "",
};
let union2: Union1 = { // ✅
name: "",
language: "",
};
let union3: Union1 = { // ✅
name: "",
color: "",
language: "",
};
let union4: Union1 = { // ❌
name: "",
};
이게 이해가 잘 안됐다..
둘 다 포함 한다? 하면
let union3: Union1 = { // ✅
name: "",
color: "",
language: "",
};
이것만 말이 되지 않나 했는데
그게 아니고..
각 각 속하는 것들 다 ok
이렇게 공통된 부분도 ok.
let union4: Union1 = { // ❌
name: "",
};
이 코드는 두 어디에도 해당이 안되는거라 그렇다.
그러니까, 포함이라는 생각보다 "해당"이라고 "조건"이라고 생각하면 이해가 쉽다.
intersection : 교집합
type Dog = {
name: string;
color: string;
};
type Person = {
name: string;
language: string;
};
type Intersection = Dog & Person;
let intersection1: Intersection = {
name: "",
color: "",
language: "",
};
이렇게 두 타입에 다 있는게 있어야 함
지피티의 보강 답변
:TypeScript에서 유니언(union) 타입이나 인터섹션(intersection) 타입을 객체에 적용할 때,
그 핵심은 "객체의 내부 속성들이 어떤 조건을 충족하느냐"보다는 전체 타입이 어떤 구조를 **"만족하거나 합쳐야 한다"**는 것에 있다.
유니언 타입 (|)
- "A 또는 B" 중 하나의 타입만 만족하면 된다
- 즉, 하나의 타입 구조만 충족하면 OK.
type Dog = { type: 'dog'; bark: () => void };
type Cat = { type: 'cat'; meow: () => void };
type Pet = Dog | Cat;
const myPet: Pet = {
type: 'dog',
bark: () => console.log("멍멍"),
};
// 이건 OK, Dog 구조만 충족했으니까.
이 경우, 객체 내부의 속성(bark, meow)이 중요한 게 아니라, 전체 구조가 Dog 타입이냐 Cat 타입이냐가 핵심.
인터섹션 타입 (&)
- "A 그리고 B" 모두의 속성을 동시에 갖는 타입이 돼야 한다
- 즉, 합쳐진 타입의 모든 속성을 다 가져야 함.
type Name = { name: string };
type Age = { age: number };
type Person = Name & Age;
const me: Person = {
name: 'Jane',
age: 28,
};
// name도 있고 age도 있으니까 OK
여기서는 Name과 Age 모두의 조건을 만족해야 하니까, 두 타입의 속성들을 모두 갖는 객체여야 함