Interface

First-class Primitive : 일급 클래스 원시 타입

한 객체가 다른 객체를 상속할 수 있게 한다.

Type

객체 타입 뿐만 아니라 모든 유형의 타입을 정의할 수 있다.

타입스크립트는 인터페이스 이름을 기반으로 인터페이스의 정보를 내부 레지스트리에 캐싱할 수 있어, extends를 사용할 때는 캐싱의 장점을 활용할 수 있다.

그러나 유니온(&) 연산자를 활용하는 경우에는 이름을 기반으로 캐싱할 수 없고, 항상 연산을 수행하기 때문에 성능상 불리하다.

레퍼런스 : https://github.com/microsoft/TypeScript/wiki/Performance#preferring-interfaces-over-intersections

이런 장점에도 불구하고 인터페이스를 기본으로 사용하는 것은 추천되지 않는다.

1. 인터페이스는 선언된 인터페이스를 병합 한다.

인터페이스는 스코프 내에 정의된 같은 이름의 서로 다른 인터페이스를 하나로 병합한다.

인터페이스는 중복으로 정의될 때 중복 할당이 허용되기 때문에 같은 이름의 서로 다른 인터페이스들의 속성을 모두 병합한다.

Type을 활용하면 중복 할당을 방지해 const 키워드를 사용한 것처럼 동작한다.