[TS] 유니언 타입

ClassBinu·2024년 3월 26일

유니언 타입

여러 타입 중에 하나가 될 수 있는 값

function padLeft(value: string, padding: string | number)

공통 필드 유니언

유니언에 있는 모든 타입에 공통인 멤머들에만 접근 가능

// @errors: 2339

interface Bird {
  fly(): void;
  layEggs(): void;
}

interface Fish {
  swim(): void;
  layEggs(): void;
}

declare function getSmallPet(): Fish | Bird;

let pet = getSmallPet();
pet.layEggs();

// 두 개의 잠재적인 타입 중 하나에서만 사용할 수 있습니다.
pet.swim();

// 'Fish | Bird' 형식에 'swim' 속성이 없습니다.
// 'Bird' 형식에 'swim' 속성이 없습니다.ts(2339)

공통 필드가 아니어도 접근 가능

// @errors: 2339
type NetworkLoadingState = {
  state: "loading";
};

type NetworkFailedState = {
  state: "failed";
  code: number;
};

type NetworkSuccessState = {
  state: "success";
  response: {
    title: string;
    duration: number;
    summary: string;
  };
};
// ---생략---
type NetworkState =
  | NetworkLoadingState
  | NetworkFailedState
  | NetworkSuccessState;

function networkStatus(state: NetworkState): string {
  // 현재 TypeScript는 셋 중 어떤 것이
  // state가 될 수 있는 잠재적인 타입인지 알 수 없습니다.

  // 모든 타입에 공유되지 않는 프로퍼티에 접근하려는 시도는
  // 오류를 발생시킵니다.
  state.code;

  // state에 swtich문을 사용하여, TypeScript는 코드 흐름을 분석하면서
  // 유니언 타입을 좁혀나갈 수 있습니다.
  switch (state.state) {
    case "loading":
      return "Downloading...";
    case "failed":
      // 여기서 타입은 NetworkFailedState일 것이며,
      // 따라서 `code` 필드에 접근할 수 있습니다.
      return `Error ${state.code} downloading`;
    case "success":
      return `Downloaded ${state.response.title} - ${state.response.summary}`;
  }
}

교차 타입(intersection)

여러 타입을 하나로 결합하여 하나의 단일 타입을 얻는 것

  • Person & Serializable & Loggable
    : 이 타입의 객체는 세 가지 타입의 모든 멤버를 갖게 됨

교차는 믹스인 패턴에 활용됨

믹스인: 여러 클래스의 기능을 결합하여 새로운 클래스를 생성하는 디자인 패턴

0개의 댓글