Published on

Effective TypeScript item7

✅ Item 7: 타입은 값들의 집합


🎯 핵심 메시지

타입은 해당 타입이 가질 수 있는 모든 값들의 집합 으로 이해하자.

타입 간의 관계, 유니언/인터섹션 타입, 서브타입을 더 명확하게 이해할 수 있다.


🔶 유니언 타입 (|) = 합집합 (Union of Sets)

type Animal = 'cat' | 'dog';
type Pet = 'dog' | 'parrot';

type AnimalOrPet = Animal | Pet; // 'cat' | 'dog' | 'parrot'

👉 여러 타입의 가능한 값을 합쳐서 하나의 집합을 구성함.


🔷 인터섹션 타입 (&) = 교집합 (Intersection of Sets)

type HasName = { name: string };
type HasAge = { age: number };

type Person = HasName & HasAge;

const p: Person = {
  name: 'Boohi',
  age: 30,
}; // ✅ name과 age 모두 필요

👉 두 타입을 모두 만족하는 구조만 포함.


✳️ type vs interface: 집합으로 해석하기

🔶 type: 값 집합을 직접 정의하거나 결합

type Fruit = 'apple' | 'banana';
type ExtendedFruit = Fruit | 'orange'; // 합집합

🔷 interface: 객체 구조를 정의하고 확장

interface User {
  id: number;
  name: string;
}

interface Admin extends User {
  role: 'admin';
}

AdminUser의 속성을 포함한 확장된 집합이다.


📚 extends와 집합 관계

type A = 'a' | 'b';
type B = 'a' | 'b' | 'c';

type Result = A extends B ? true : false; // ✅ true
type Result2 = B extends A ? true : false; // ❌ false

extends부분집합 관계를 의미함.