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 모두의 조건을 만족해야 하니까, 두 타입의 속성들을 모두 갖는 객체여야 함