9

Lassen Sie uns sagen, ich habe eine Schnittstelle:Typprüfung und Generika

interface Comparable<T> { 
    equals(other:T):boolean 
} 

die dann in mehreren Klassen Ich bin Umsetzung:

class Rectangle implements Comparable<Rectangle> { 

    equals(other:Rectangle):boolean { 
     // logic 
     return true; 
    } 

} 

class Circle implements Comparable<Circle> { 

    equals(other:Circle):boolean { 
     // logic 
     return true; 
    } 

} 

Warum Typoskript zum Vergleichen Rechteck und Kreis ermöglicht?

let circle:Circle = new Circle(); 
let rectangle:Rectangle = new Rectangle(); 
console.log(circle.equals(rectangle)); 

Sollte es mich nicht warnen, dass ich nicht kompatibel Typ Kreises vorgesehen gleich Methode?

Antwort

9

Wie JavaScript verwendet TypeScript die Enttippung. In diesem Beispiel sind also Rechteck und Kreis identisch.

Sobald diese Klassen ihre eigenen Implementierungen hinzufügen, schlägt die Entschlüsselung fehl und der TypeScript-Compiler gibt Ihnen Fehler.

class Rectangle implements Comparable<Rectangle> { 

    width: number; 
    height: number; 

    equals(other:Rectangle): boolean { 
     // logic 
     return true; 
    } 

} 

class Circle implements Comparable<Circle> { 

    diameter: number; 

    equals(other:Circle): boolean { 
     // logic 
     return true; 
    } 

} 
6

Da Ihr Rechteck und Kreis strukturell identisch ist, behandelt Typoskript sie als austauschbare Typen (siehe „Ente eingeben“). Nur Ihr Kreis und Rechteck konkretisieren, indem sie einige miteinander unverträglichen Eigenschaften zu ihnen und fügte hinzu:

class Rectangle implements Comparable<Rectangle> { 
    x: number; 
    equals(other:Rectangle):boolean {return true;} 
} 
class Circle implements Comparable<Circle> { 
    rad: number; 
    equals(other:Circle):boolean {return true;} 
} 

Und Sie werden die Fehler sehen angezeigt. Dies ist übrigens der gleiche Grund, warum Sie einem Circle-typed var ein Objektliteral zuweisen können, solange es die richtigen Eigenschaften hat:

var c: Circle = {rad: 1, equals:() => true}