2017-02-21 3 views
0

In der Angular 2 guide Dependency Injection (im ersten Kapitel Warum Abhängigkeit Injektion?) gibt es einige seltsame Codezeilen. Sie arbeiten, aber ich weiß nicht warum. Sie finden das laufende Beispiel auch unter https://angular.io/resources/live-examples/dependency-injection/ts/eplnkr.html.Seltsame Typoskript Vererbung auf Angular 2 Guide Tutorial DI

In der Datei car.ts die Klasse Motor und die Klasse Car deklariert als:

export class Engine { 
    public cylinders = 4; 
} 

export class Car { 
    public description = 'DI'; 

    constructor(public engine: Engine, public tires: Tires) { } 
    ... 
} 

in der Datei Auto-creation.ts die Klasse Auto verwendet wird. ..

import { Car, Engine, Tires } from './car'; 

class Engine2 { 
    constructor(public cylinders: number) { } 
} 

export function superCar() { 
    // Super car with 12 cylinders and Flintstone tires. 
    let bigCylinders = 12; 
    let car = new Car(new Engine2(bigCylinders), new Tires()); 
    car.description = 'Super'; 
    return car; 
} 

Es funktioniert ohne Warnungen oder Fehler vom Typescript-Compiler.

Seltsam! Warum ist es möglich, ein Auto mit einem falschen Motortyp zu erstellen?
new Engine2(...) erstellt ein Objekt aus der Klasse Engine2, das nicht von der Klasse Engine abgeleitet ist.

Ist dieses Verhalten ein Fehler oder eine Funktion von Typescript?

Ich würde die folgenden Codezeilen in der Datei car-creation.ts erwarten.

class Engine2 extends Engine { 
    constructor(public cylinders: number) { 
    super(); 
    } 
} 

... oder ...

class Engine2 extends Engine { 
    constructor(cylinders: number) { 
    super(); 
    this.cylinders = cylinders; 
    } 
} 

Antwort

1

Typoskript verwendet strukturelle Typisierung statt nominal Typisierung. Sie können mehr zum Thema here finden. Obwohl Sie class schreiben, ist es keine ... Klasse im Sinne von Klassenvererbung. Es ist nur Syntax Zucker zum Erstellen einer Prototype.

Obwohl sie nicht von einander erben, sind sie auf struktureller Ebene gleich. Beide haben ein public Mitglied cylinders das ist ein number. Während Engine immer 4 Zylinder haben wird, können Sie Engine2 mit einer beliebigen Anzahl von Zylindern initiieren.

Schreiben des Konstruktors wie constructor(public cylinders: number) {} ist Syntax Zucker zum Initialisieren eines öffentlichen Members.