Typescript

[Typescript] Type vs Interface

__ellie 2021. 8. 12. 00:07
반응형

이번 글에서는 Type과 Interface의 차이점을 정리했다.

Type Alias vs Interface - 구현

  • 모든 곳에 인터페이스를 쓰는 것은 좋지 않다.
  • 타입과 인터페이스는 다르다.
type PositionType = {
  x: number; 
  y: number
}

interface PositionInterface {
  x: number;
  y: number;
}

const obj1: PositionType = {
  x: 1, 
  y: 2
}

const obj2: PositionInterface = {
  x: 1, 
  y: 2
}

class Pos1 implements PositionType {
  x: number 
  y: number
}

class Pos2 implements PositionInterface {
  x: number 
  y: number
}

// extends

interface ZPositionInterface extends PositionInterface {
  z: number
}

type ZPositionType = PositionType & {z: number};
  • 초기에는 타입을 확장할 수 있는 방법이 없었고, 타입을 이용해서 할 수 있는 것들이 별로 없었지만

  • 이제는 굉장히 비슷하다.

// extends 
interface PositionInterface {
  x: number;
  y: number;
}

interface PositionInterface {
  z: number
}

const obj: PositionInterface {
  x: 1, 
  y: 2, 
  z: 3,
}
// only interfaces can be merged 
  • 다만, 이 시점에서는 인터페이스만 결합이 된다.

  • 결합 후에는 항상 두 가지가 결합한 것으로 이용해야 한다.

  • 타입은 이렇게 할 수 있는 방법이 없다.

  • 타입만 할 수 있는 것도 있는데

  • type alias can use computed properties

type Person =  {
  name: string, 
  age: number, 
}

type Name = Person['name']; // string
type NumberType = number;
type Direction = 'left' | 'right';
  • 이런 union type들은 interface로는 구현할 수 없다.

Type vs Interface - 개념

  • 인터페이스는 규격사항이다.

  • object와 object간에 의사소통할 때 인터페이스를 토대로 해서 서로 소통할 수 있다.

  • 인터페이스를 정의해놓으면, 이 인터페이스를 구현하는 사람들이 인터페이스를 구현하게 된다.

  • 동일한 규격사항을 따라간다고 할 수 있다.

  • 어떤 특정 규격을 정의하는 것이라면, 이 규격을 통해서 어떤 것이 구현된다면 바로 인터페이스를 쓰는 것이 더 정확하다.

  • 다른 프로그래밍 언어에서도 인터페이스는 이런 용도로 이용된다.

  • 반대로 타입은..

  • 우리가 어떠한 데이터를 담을 때 어떠한 데이터를 담을 수 있을지 데이터의 타입을 결정하는 것이다.

  • Position이라는 것은 Position이 어떤 데이터를 담고 있는 걸 묘사하고 있으므로

  • 인터페이스보다 타입을 사용하는 것이 더 좋다.

  • interface를 보면, Position을 구현하는 뭔가가 있는건가? 라는 생각이 들게 된다.

  • 어떠한 것을 구현하는 것이 아니라, 데이터를 담을 목적이라면 타입을 쓰는 것이 좋다.

  • 타입스크립트 초창기에는 type alias가 강력하지 않아서 할 수 있는 것이 많지 않았기 떄문에 인터페이스를 권장했었는데

  • 지금은 type alias가 막강해지고 있고 인터페이스와 타입을 구분해서 쓰는 것이 더 좋다는 의견이 많다.

  • 인터페이스는 규격사항임!

마치며

인터페이스와 타입의 차이를 알아보았다.
자바를 공부할 때는 인터페이스를 언제쓰는지 명확했다. 인터페이스를 먼저 정의한 후에, 실제 클래스를 구현한다거나,
JDBC할 때 데이터베이스 벤더 사에서 제공하는 API가 모두 같은 인터페이스를 구현해서, 개발용으로 h2 데이터베이스를 사용하다가 production에서는 mysql로 교채해도 데이터베이스에서 제공하는 추상화된 클래스를 사용하기 때문에 문제가 없었다.

지금 회사에서는 특별한 경우가 아니라면, 인터페이스를 쓰도록 권장하고 있는데 정확한 이유는 내가 이해하지 못했었다.(이것도 물어봐야 겠다...
아무튼 인터페이스와 타입이 거의 같다는 것, Type과 Interface가 주는 의미가 다르므로 구분해서 사용하는 것이 더 이해하기 쉬운 코드를 작성할 수 있다는 것을 알게 됐다!

끝!