javascript

TypeScript에서 유니온 타입(|)과 인터섹션 타입(&)을 헷갈렸던 사례

배경 코드

type Locale = "ko" | "en" | "ja";
type FlagsValue = { value: Locale; label: string };

const languages: (FlagsValue | { value: "original"; label: string })[] = [
  { value: "original", label: "Original" },
  { value: "ko", label: "한국어" },
  { value: "ja", label: "日本語" },
  { value: "en", label: "English" },
];

정리 1: |& 를 헷갈렸던 부분

처음에 FlagsValue | { ... } 가 아니라
FlagsValue & { ... } 로 착각하고 사용하려고 했다.

하지만 &(인터섹션 타입)를 사용하면
두 타입을 모두 만족하는 하나의 객체가 되어야 한다.

즉 이런 식의 이상한 형태를 요구하게 된다.

{
  value: Locale;
  label: string;
  value: "original";
  label: "Original";
}

현실적으로는 말이 안 되는 타입이다.

그래서 이 경우에는 |(유니온 타입)를 사용해서
다음 중 하나가 올 수 있도록 정의하는 것이 맞다.

  • { value: "ko"; label: "한국어" }

  • { value: "ja"; label: "日本語" }

  • { value: "en"; label: "English" }

  • { value: "original"; label: string }


정리 2: 배열 앞에서 타입을 합치는 방법

배열에 유니온 타입을 적용할 때는
() 로 묶어서 배열 요소 타입을 명확히 지정할 수 있다.

const languages: (FlagsValue | { value: "original"; label: string })[] = [
  ...
];

이렇게 하면
“배열 안의 각 요소가 FlagsValue이거나 original 타입 중 하나”라는 의미가 된다.


한 줄 요약

  • |이것 혹은 저것 (or)

  • &이것과 저것을 합친거 (and)

  • 배열에서 유니온 타입을 쓰려면 () 로 요소 타입을 묶어주자