this 는 값 뿐만 아니라 타입으로도 사용할 수 있다
메소드의 반환 타입을 지정할 때 this 타입을 유용하게 사용 가능하다
set 자료구조로 두 가지 연산을 하는 예제
let set = new Set
set.add(1).add(2).add(3)
set.has(2) // true
set.has(4) // false
class Set {
has (value: number): boolean {
//
}
add (value: number): Set {
//
}
}
지금 까지는 평범하다
Set을 상속받는 서브크랠스를 만들어보면 이야기가 다르다
class MutableSet extends Set {
delete (value: number): boolean {
//
}
add (value: number): MutableSet {
//
}
}
add() 함수의 경우 Set을 반환하기 때문에 MutableSet 을 반환하도록 오버라이드 한다
이처럼 클래스를 상속받는 서브 클래스는 this를 반환하는 모든 시그니처를 오버라이드해야 한다
이렇게 같은 기능도 오버라이드 해야한다면 상속을 받는 것이 큰 의미가 없을 것 같다
class Set {
has(value: number): boolean {
//
}
add (value: number): this {
//
}
}
이처럼 반환 타입을 this 로 지정하면 이와 같은 문제를
해결할 수 있다
Set의 this 는 Set 인스턴스를, MutableSet의 this 는 MutableSet 을 자동으로 가리키므로 MutableSet 에서 오버라이드할 필요가 없다