-
[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
https://www.typescriptlang.org/docs/handbook/advanced-types.html#interfaces-vs-type-aliases
'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 댓글