2017-02-21 34 views
0

В Angular 2 guide Dependency Injection (в первой главе Почему инъекция зависимостей?) есть некоторые странные строки кода. Они работают, но я не знаю, почему. Вы также можете найти рабочий пример на https://angular.io/resources/live-examples/dependency-injection/ts/eplnkr.html.Наследование Strange Bookscript на Angular 2 Руководство по руководству DI

В файле car.tsкласс двигателя и класс автомобилей объявлены как:

export class Engine { 
    public cylinders = 4; 
} 

export class Car { 
    public description = 'DI'; 

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

В файле машино-creation.ts используется класс автомобилей. ..

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; 
} 

Он работает без предупреждений или ошибок с помощью компилятора TypScript.

Странно! Почему можно создать автомобиль с неправильным типом двигателя?
new Engine2(...) создает объект из класса Engine2, который не является производным от класса Engine.

Возможно, это ошибка или особенность машинописного машиностроения?

Я ожидал бы следующие строки кода в файле car-creation.ts.

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

... или ...

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

ответ

1

машинопись использует структурную типизацию вместо номинального ввода. Вы можете найти еще по теме here. Даже если вы пишете class, это не класс ... в смысле классового наследования. Это просто синтаксический сахар для создания Prototype.

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

class Engine { 
    public cylinders = 4; 
} 

Несмотря на то, что они не наследуют друг от друга, они одинаковы на структурном уровне. Оба имеют член publiccylinders, который является number. В то время как Engine всегда будет иметь 4 цилиндра, вы можете установить Engine2 с любым количеством цилиндров.

Написание конструктора, такого как constructor(public cylinders: number) {}, представляет собой синтаксический сахар для инициализации публичного участника.