[Typescript] Type Alias vs. Interface

Swimme·2021년 1월 24일
2

Typescript

목록 보기
2/2

타입 별칭 (Type Aliases)

  • Type Alias는 타입의 새로운 이름을 생성한다.
  • 프로그래머의 의도를 보다 명확하게 나타낼 수 있다.

Interface와의 비교

Declaration Merging

  • Interface는 같은 이름으로 여러 번 선언을 해도 컴파일 시점에서 합쳐지기 때문에 확장성이 좋다.
    • 다음 이유로 외부에 노출해야 하는 public API에 사용되는 타입은 항상 interface를 사용하여 작성해야 한다.
  • 따라서 일반적으로는 interface를 사용하고 union, tuple 등이 필요한 경우에만 type 별칭을 사용한다.

extends, implements 사용

  • Type Alias도 상속, 확장의 개념에서 extendsimplements를 사용할 수 있지만 타입 정의 내에 union이 사용된 경우 사용할 수 없다.
    • 정적으로 모양을 알 수 있는 객체 타입만 동작하기 때문
  type TypeA = {
    str: string;
  };

  // union type으로 정의된 경우 extends 나 implements 와 사용할 수 없다.
  type TypeB = TypeA | {
    num: number;
  };

  class Person implements TypeB {}  /* 오류 */
  // A class can only implement an object type or intersection of object types with statically known members.

  interface Person extends TypeB {} /* 오류 */
  // An interface can only extend an object type or intersection of object types with statically known members.

그 외

  • Type Alias는 말 그대로 기본타입, 배열과 튜플, 유니온 타입 등에 새로운 이름을 붙일 수 있다. 인터페이스는 불가능.
  type Name = string;

  type myAction =
  | { type: "COUNT"; count: number }
  | { type: "EAT"; food: string }
  | { type: "READ"; book: string };
  • 실제로는 새 타입을 생성하는 것이 아니기 때문에 타입과 관련된 에러가 발생했을 시 실제 타입을 보여준다. 인터페이스는 실제로 새 타입을 생성하고 관련 타입 에러에는 인터페이스 쪽이 문제가 있다고 가르쳐준다.

TypeScript 팀은 개방-폐쇄 원칙(소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 열려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다)에 따라 확장에 열려있는 JavaScript 객체의 동작 방식과 비슷하게 연결하도록 Interface를 설계했습니다.

참고:

리액트의 state 타입 지정을 할 때 예시에서 type 키워드를 사용하는 것을 보고 interface와의 확실히 하고 싶어 찾아보았다. state 타입 지정은 일반적으로 인터페이스를 사용하고, union 혹은 tuple 타입을 써야하는 경우 type 을 사용한다. useReducer에서 action 정의는 type을 사용해야 하는 경우이다. 내가 느끼는 가장 큰 차이점은 declaration merging이며 public api의 경우 interface를 사용하는 것이 맞고, 그 외에는 팀 내 공통 컨벤션을 정하여 사용하면 될 듯 하다.

profile
Life is Egg..🥚🐣🌟

0개의 댓글