반응형
클래스는 구조 기반 타입을 지원한다
TypeScript는 클래스를 비교할 때 다른 타입과 달리 이름이 아니라 구조를 기준으로 삼습니다.
클래스는 자신과 똑같은 프로퍼티와 메서드를 정의하는 기존의 일반 객체를 포함해 클래스의 형태를 공유하는 다른 모든 타입과 호환됩니다.
예를 들어 TypeScript에선 Zebra를 인수로 받는 함수에 Poodle을 전달한다고 해서 반드시 에러를 발생시키진 않기 때문입니다.
class Zebra {
trot(){
// 블라블라
}
}
class Poodle {
trot() {
// 여기도 블라블라
}
}
function ambleAround(animal: Zebra){
animal.trot()
}
let zebra = new Zebra
let poodle = new Poodle
ambleAround(zebra) // It's OK
ambleAround(poodle) // It's OK
계통 유전학적으로 얼룩말은 푸들과 전혀 다른 종이지만 함수의 관점에선 두 클래스가 .trot을 구현하며 서로 호환되므로 아무 문제가 없습니다.
이름으로 클래스의 타입을 구분하는 언어라면 에러를 발생시키겠지만 TypeScript는 구조를 기준으로 삼으므로 위의 코드는 정상적으로 동작합니다.
※ 단, private이나 protected 필드를 갖는 클래스는 상황이 다릅니다.
클래스에 private이나 protected 필드가 있고, 할당하려는 클래스나 서브 클래스의 인스턴스가 아니라면 할당할 수 없다고 판정합니다.
class A {
private x = 1
}
class B extends A {}
function f(a: A){}
f(new A) // OK
f(new B) // OK
// '{ x: number; }' 형식의 인수는 'A' 형식의 매개 변수에 할당될 수 없습니다.
// 'x' 속성은 'A' 형식에서 private이지만 '{ x: number; }' 형식에서는 그렇지 않습니다.ts(2345)
f({x: 1})
반응형
'👶 TypeScript' 카테고리의 다른 글
다형성 (0) | 2023.01.16 |
---|---|
클래스는 값과 타입을 모두 선언한다 (0) | 2023.01.16 |
인터페이스 구현 VS 추상 클래스 상속 (0) | 2023.01.15 |
인터페이스 구현 (0) | 2023.01.15 |
선언 합침 (0) | 2023.01.15 |