타입스크립트 (7) 인터페이스

김태완·2024년 11월 21일
post-thumbnail

인터페이스


  • 인터페이스란 타입 별칭과 동일하게 타입에 이름을 지어주는 또 다른 문법이다.
  • 예를 들어, 간단한 Person 객체의 타입을 정의한다면 다음과 같이 할 수 있다.
  • 이렇게 정의한 인터페이스를 타입 주석과 함께 사용해 변수의 타입을 정의할 수 있다.
  • 이렇듯 인터페이스는 타입 별칭과 문법만 조금 다를 뿐 기본적인 기능은 거의 같다.

선택적 프로퍼티

  • 인터페이스에서도 동일하게 선택적 프로퍼티 설정이 가능하다.

읽기 전용 프로퍼티

  • 읽기 전용 프로퍼티 또한 동일하게 설정 가능하다.

매서드 타입 정의하기

  • 다음과 같이 매서드의 타입을 정의하는 것 또한 가능하다.
  • 프로퍼티에 저장된 값이 함수인 프로퍼티를 메서드라고 부른다.
  • 이렇게 호출 시그니쳐를 이용해서 메서드의 타입을 정의할 수 있다.

매서드 오버로딩

  • 함수 타입 표현식으로 메서드의 타입을 정의하면 메서드의 오버로딩 구현이 불가능하다.
  • 그러나 호출 시그니처를 이용해 메서드의 타입을 정의하면 오버로딩 구현이 가능하다.

하이브리드

  • 인터페이스 또한 함수이자 일반 객체인 하이브리드 타입을 정의할 수 있다.

주의할 점

  • 인터페이스는 대부분의 상황에 타입 별칭과 동일하게 동작하지만 몇가지 차이점이 존재합니다. 타입 별칭에서는 다음과 같이 Union이나 Intersection 타입을 정의할 수 있었던 반면 인터페이스에서는 할 수 없다.
  • 따라서 인터페이스로 만든 타입을 Union 또는 Intersection으로 이용해야 한다면 다음과 같이 타입 별칭과 함께 사용하거나 타입 주석에서 직접 사용해야한다.

인터페이스 확장(=상속)

  • 인터페이스 확장이란 하나의 인터페이스를 다른 인터페이스들이 상속받아 중복된 프로퍼티를 정의하지 않도록 도와주는 문법이다.
  • 각 타입 들을 자세히 살펴보면 Animal 타입을 기반으로 Dog, Cat, Chicken이 각각의 추가적인 프로퍼티를 갖고 있는 형태임을 알 수 있다. 추가로 name 그리고 age 프로퍼티가 모든 타입에 중복해서 정의되어 있다는 점도 함께 발견할 수 있다.
  • 그러나 중복 코드는 언제나 좋지 않다.
  • 만약 Animal 타입의 프로퍼티가 변경된다면, 이를 기반으로 하는 나머지 타입들의 프로퍼티도 다 변경해줘야 한다.
  • 이렇게 특정 인터페이스를 기반으로 여러개의 인터페이스가 파생되는 경우, 중복 코드가 발생할 수 있는데 이럴 때에는 인터페이스의 확장 기능을 이용하면 좋다.
  • interface 타입이름 extends 확장_할_타입이름 형태로 extends 뒤에 확장할 타입의 이름을 정의하면 해당 타입에 정의된 모든 프로퍼티를 다 가지고 오게된다.
  • 따라서 Dog, Cat, Chicken 타입은 모두 Animal 타입을 확장하는 타입이기 때문에 name, age 프로퍼티를 갖게 된다. (= 인터페이스 Dog는 인터페이스 Animal을 확장한다)
  • 이때 확장 대상 타입인 Animal은 Dog 타입의 슈퍼타입이 된다.

프로퍼티 재 정의하기

  • 다음과 같이 확장과 동시에 프로퍼티의 타입을 재 정의 하는 것 또한 가능하다.
  • Dog 타입은 Animal 타입을 확장하며 동시에 name 프로퍼티의 타입을 String 타입에서 “doldol” String Literal 타입으로 재정의 했다. 이렇게 확장받는 타입에서 프로퍼티의 타입을 재정의 할 수 있다.
  • 그런데 한가지 주의할 점은 프로퍼티를 재 정의할 때 원본 타입을 A, 재 정의된 타입을 B라고 하면 반드시 A가 B의 슈퍼 타입이 되도록 재정의 해야한다.
  • 따라서 다음과 같이 name을 Number 타입으로 재 정의 하는 것은 불가능하다.
  • 왜냐하면 Dog 타입이 Animal 타입을 확장한 다는 것은 Animal 타입의 서브타입이 된다는 의미이다. 그런데 name 프로퍼티를 Number 타입으로 재 정의 해 버리면 이제는 Dog는 Animal의 서브 타입이 아니게 된다. 따라서 이런 재 정의는 불가한 것이다.

타입 별칭을 확장하기

  • 인터페이스는 인터페이스 뿐만 아니라 타입 별칭으로 정의된 객체도 확장할 수 있다.

다중 확장

  • 여러개의 인터페이스를 확장하는 것 또한 가능하다.

인터페이스 선언 합치기

선언 합침

  • 타입 별칭은 동일한 스코프 내에 중복된 이름으로 선언할 수 없다.
  • 하지만 인터페이스는 가능하다.
  • 이렇게 되는 이유는 중복된 이름의 인터페이스 선언은 결국 모두 하나로 합쳐지기 때문이다.
  • 따라서 위 코드에서 선언한 Person 인터페이스들은 결국 합쳐져서 다음과 같은 인터페이스가 된다.
  • 이렇게 동일한 이름의 인터페이스들이 합쳐지는 것을 선언 합침(Declaration Merging)이라고 부른다. 따라서 다음과 같이 사용할 수 있다.
주의할 점
  • 만약 다음과 같이 동일한 이름의 인터페이스들이 동일한 이름의 프로퍼티를 서로 다른 타입으로 정의한다면 오류가 발생한다.
  • 첫번째 Person에서는 name 프로퍼티의 타입을 string 으로, 두번째 Person 에서는 name 프로퍼티의 타입을 number 타입으로 정의했다.
  • 이렇게 동일한 프로퍼티의 타입을 다르게 정의한 상황을 ‘충돌’ 이라고 표현하며 선언 합침에서 이런 충돌은 허용되지 않는다.

이미지 출처: <한 입 크기로 잘라먹는 타입스크립트>
https://www.inflearn.com/course/%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8?inst=68d752f7&utm_source=instructor&utm_medium=referral&utm_campaign=inflearn_%ED%8A%B8%EB%9E%98%ED%94%BD_promotion-link

profile
중고

0개의 댓글