클래스와 인터페이스

정승옥(seungok)·2022년 4월 3일
0

타입스크립트

목록 보기
4/4
post-thumbnail

1. 클래스

  • 코드를 조직하고 이해할 수 있는 방법을 제공
  • 캡슐화의 주요 단위
  • 프로퍼티 초기자, 다형성, 데코레이터, 인터페이스 지원
  • 프로퍼티 초기자, 데코레이터는 런타임 코드 생성
  • 가시성 접근자, 인터페이스, 제네릭 등 타입스크립트 고유 기능은 컴파일 타임에만 존재

1-1. 접근 한정자

  • public : 어디에서나 접근할 수 있는 기본 접근 수준
  • protected : 해당 클래스와 서브 클래스의 인스턴스에서만 접근
  • private : 해당 클래스의 인스턴스에서만 접근

1-2. abstract

abstract class Piece{
  // ...
  moveTo(position: Position){
    this.position: position
  }
  abstract canMoveTo(position: Position) : boolean
  • abstract 키워드는 해당 클래스에서 바로 인스턴스화할 수 없음을 의미
  • canMoveTo 메서드를 구현하지 않으면 컴파일 타임에 에러 발생
  • 필요한 메서드를 추상 클래스에 자유롭게 추가할 수 있고 추상클래스를 구현할 때는 추상 메서드도 반드시 구현해야 함

2. this

class Set {
  has(value: number): boolean {
    // ...
  }
  add(value: number): this {
    // ...
  }
}

class MutableSet extends Set {
  delete(value: number): boolean{
    // ...
  }
  • this 를 값 뿐만 아니라 타입으로도 사용 가능
  • Set 의 this 는 Set 인스턴스를, MutableSet 의 this 는 MutableSet 인스턴스를 자동으로 가리키므로 오버라이드 할 필요가 없다.

3. 인터페이스 & 타입 별칭

  • 타입 별칭은 오른편에 모든 타입이 등장하지만 인터페이스는 반드시 형태가 나와야 함
  • 인터페이스를 상속할 때 상속받는 인터페이스의 타입에 상위 인터페이스를 할당할 수 있는지 확인해야 함
  • 이름과 범위가 같은 인터페이스가 여러 개 있다면 자동으로 합쳐짐

3-1. 선언 합침

interface User{
  name: string
}
interface User{
  age: number
}
let a: User = {
  name: 'Ashley',
  age: 30
}
  • 같은 이름의 인터페이스를 두 개 정의하면 자동으로 하나의 인터페이스로 합쳐짐
  • 다른 프로퍼티 선언도 같은 타입을 가져야 하며 다를 경우 에러 발생

4. 다형성

class MyMap<K, V>{
  constructor(initialKey: K, initialValue: V) {
    // ...
  }
  get(key: K): V {
    // ...
  }
  set(key: K, value: V): void {
    // ...
  }
  merge<K1, V1>(map: MyMap<K1, V1>): MyMap<K | K1, V | V1> {
    // ...
  }
  static of<K, V>(k: K, v: V): MyMap<K, V> {
    // ...
  }
}
  • MyMap 의 모든 인터페이스 메서드와 인스턴스 프로퍼티에서 K 와 V 를 사용할 수 있음
  • constructor 에는 제네릭 타입을 선언할 수 없기에 class 선언에 사용해야 함
  • 정적 메서드는 클래스 수준의 제네릭을 사용할 수 없기에 of 는 K 와 V 에 접근할 수 없고 자신만의 K 와 V 를 직접 선언

5. 믹스인

  • 자바스크립트와 타입스크립트에서 키워드를 제공하지 않지만 직접 구현 가능
  • 믹스인 이란 동작과 프로퍼티를 클래스로 혼합할 수 있게 해주는 패턴
  • 믹스인 규칙
    • 상태를 가질 수 있다.
    • 구체 메서드만 제공할 수 있다.
    • 생성자를 가질 수 있다.

6. 데코레이터

  • 타입스크립트의 실험적 기능
  • 클래스, 클래스 메서드, 프로퍼티, 메서드 매개변수를 활용한 메타 프로그래밍에 깔끔한 문법을 제공
profile
Front-End Developer 😁

0개의 댓글