-
[TS] Interface vs Typeprograming/Language 2020. 2. 20. 21:39
안녕하세요, Einere입니다.
(ADblock을 꺼주시면 감사하겠습니다.)
이번 포스트에서는 타입스크립트의 인터페이스와 타입에 대해 알아보도록 하겠습니다.
Type
흔히 사용하게 되는
type foo = number | string
과 같은 구문을 타입 앨리어스(type alias)라고 합니다. 이름에서 유추할 수 있듯이, 타입 앨리어스는 주어진 자료형에 대한 별명을 만들어주는 역할을 합니다. 즉, 실제로 새로운 자료형을 만드는 것이 아닙니다.이름있는 객체 자료형을 만드는 인터페이스와는 달리, 타입 앨리어스는 프리미티브, 유니온, 인터섹션을 포함하여 어느 자료형이든 만들 수 있습니다.
또한, 추가적으로 타입 파라미터(type parameter)를 선언할 수 있습니다. 타입 파라미터는 실제로 제공될 타입을 위한 플레이스홀더로서 사용됩니다. 이와 같이, 타입 파라미터를 가지는 타입 앨리어스를 제네릭 타입 앨리어스(generic type alias)라고 합니다.
type Tree<T> = { value: T; left: Tree<T>; right: Tree<T>; }
타입은 재귀적으로 선언될 수 있습니다.
type Yikes = Array<Yikes>; // error
그러나, 위와 같이 선언문 우변에 존재할 수는 없습니다.
Interface
제가 이전에 썼던 글로 대체하겠습니다.
두개의 차이점은?
타입과 인터페이스는 유사합니다. 그러나 인터페이스가 타입에 비해 좀 더 가용성이 높습니다. (자세한 것은 위의 인터페이스 링크를 참고해주세요.)
- 타입은 새로운 이름을 만들지 않습니다. (즉, 에러 메시지같은 곳에서 별명으로 출력되지 않고, 리터럴 그대로 출력됩니다.) 그러나 인터페이스는 새로운 이름을 만듭니다.
- 인터페이스는 상속(extends)되거나 구현(implements)될 수 있습니다. 반대로 다른 타입을 상속하거나 구현할 수 있습니다. 그러나 객체 타입 리터럴의 앨리어스는 그렇지 않습니다. (TS 2.7 부터는 타입도 인터섹션을 통해 다른 타입을 상속할 수 있습니다.)
- 인터페이스는 여러 병합된 선언(merged declaration)을 가질 수 있습니다. 즉, 같은 이름의 인터페이스를 여러번 선언할 수 있습니다. 그러나 객체 타입 리터럴의 앨리어스는 그렇지 않습니다.
그럼 둘중에 어느것을 사용해야 할까요?
공식 문서에는 최대한 타입 대신 인터페이스를 사용하라고 나와있으며, 인터페이스로 표현할 수 없는 형태이거나 유니온 혹은 튜플을 사용해야 하는 경우라면 타입을 사용해야 한다고 합니다.
참고
https://stackoverflow.com/questions/37233735/typescript-interfaces-vs-types
Typescript: Interfaces vs Types
What is the difference between these statements (interface vs type)? interface X { a: number b: string } type X = { a: number b: string };
stackoverflow.com
https://www.typescriptlang.org/docs/handbook/advanced-types.html#interfaces-vs-type-aliases
Advanced Types · TypeScript
Table of contents # Intersection Types Union Types Type Guards and Differentiating Types Nullable types Type Aliases String Literal Types Numeric Literal Types Enum Member Types Discriminated Unions Polymorphic this types Index types Mapped types Condition
www.typescriptlang.org
'programing > Language' 카테고리의 다른 글
[TS] TS with React - hook 사용하기 2 (0) 2020.02.23 [TS] TS with React - hook 사용하기 1 (0) 2020.02.23 [TS] TypeScript 기초 - 6 (0) 2020.02.01 [TS] TypeScript 기초 - 5 (0) 2020.01.31 [TS] TypeScript 기초 - 4 (0) 2020.01.28 댓글