2016-03-27 5 views
0

Ich bin neu in Typescript.Complile-Fehler in Typoskript

Ich schrieb den Code unten heute und ich habe diesen Kompilierfehler in meinem Editor.

Typ 'EngineFactory' ist nicht übertragbar 'EngineInterface' eingeben. Property 'run' fehlt im Typ 'EngineFactory'.

Ich verstehe, was diese Fehlermeldung bedeutet, aber ich weiß nicht, wie Sie diesen Fehler beheben können. Bitte bringen Sie mir den geeigneten Weg bei, diesen Fehler zu beheben.

interface EngineInterface { 

    run(); 

} 


class HondaEngine implements EngineInterface{ 

    constructor() {} 

    run() {} 

} 


class ToyotaEngine implements EngineInterface{ 

    constructor() {} 

    run() {} 

} 

enum EngineType { 

    Honda, 
    Toyota 

} 


class EngineFactory { 

    constructor(engineType: EngineType){ 

     if (engineType === EngineType.Honda) { 
      return new HondaEngine(); 
     } 

     if (engineType === EngineType.Toyota) { 
      return new ToyotaEngine(); 
     } 

    } 

} 



class Car { 

    private engine: EngineInterface; 

    constructor(engineType: EngineType) { 
     this.engine = new EngineFactory(engineType); 
    } 

} 



let car = new Car(EngineType.Toyota); 

HINWEIS

diese Weise Schreiben von Code unten ergibt keine Kompilierung-Fehler. Aber ich frage mich, ob es eine andere Möglichkeit gibt, den Fehler zu beheben, den ich oben eingefügt habe.

class EngineFactory { 

    constructor(){} 

    static getEngine(engineType: EngineType): EngineInterface { 

     if (engineType === EngineType.Honda) { 
      return new HondaEngine(); 
     } 

     if (engineType === EngineType.Toyota) { 
      return new ToyotaEngine(); 
     } 
    } 
} 

class Car { 

    private engine: EngineInterface; 

    constructor(engineType: EngineType) { 
     this.engine = EngineFactory.getEngine(engineType); 
    } 

} 


let car = new Car(EngineType.Toyota); 

Ich wünschte, ich könnte die zurückgegebene Art in Konstruktor-Methode definieren ...

class EngineFactory { 

    // Typescript won't let me define returned type in constructor. 
    constructor(engineType: EngineType): EngineInterface{ 

     if (engineType === EngineType.Honda) { 
      return new HondaEngine(); 
     } 

     if (engineType === EngineType.Toyota) { 
      return new ToyotaEngine(); 
     } 

    } 

} 

Antwort

2
  1. Es ist sinnlos, ein Objekt in Konstruktorfunktion zurückzukehren.
  2. Es wäre klarer, wenn Sie Code auf diese Weise schreiben:

    Klasse EngineFactory { Konstruktor() {}

    static getEngine(engineType: EngineType): EngineInterface { 
        switch(EngineType): 
          //case .... 
    } 
    

    }