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. 데코레이터
- 타입스크립트의 실험적 기능
- 클래스, 클래스 메서드, 프로퍼티, 메서드 매개변수를 활용한 메타 프로그래밍에 깔끔한 문법을 제공