Compilatorul TypeScript nu afișează TypeError


Am o problemă cu compilatorul TypeScript. De ce nu sunt afișate erori pentru următorul fragment de cod?

class A {

}

class B {
  myVar:string;
}

class Foo {
  bar(a:A){}

  doSomething(){
    this.bar(new B());
  }
}

Deoarece B nu este A, nu ar trebui să fie interzis apelul bar cu un B?

Răspuns #1

Apelul *bar-* nu ar trebui interzis aici, deoarece TypeScript are relații de tip structurale. Așadar, A și B sunt comparate nu doar după nume, ci prin enumerarea și compararea membrilor lor, conform specificației. După cum urmează.

  1. Apelul bar() necesită ca tipul argumentului său să fie atribuit tipului parametrului corespunzător. Așadar, tipul „new B()” ar trebui să fie atribuibil lui „A” (secțiunea specificațiilor 4.12.1 „Rezolvarea suprasarcinilor”)

  2. Dacă comparăm „B” și „A” din punct de vedere structural conform algoritmului prezentat în secțiunea 3.8.4 „Compatibilitatea atribuției” din specificație, vedem că „B” poate fi atribuit lui „A”.

Dacă vrei să experimentezi mai departe, adaugă doar o proprietate „x” în clasa A. Și vei vedea eroarea ta.