2016-07-12 16 views
0

Ich habe eine winzige Code-Implementierung in Typescript, wo ich eine Klasse entweder eine Schnittstelle implementieren oder eine Klasse erweitern.Typescript Vererbung wo Datentypen in IntelliSense ist any anstelle der erwarteten Zahl

interface ITest { 
    run(id: number): void 
} 

abstract class Test implements ITest { 

    abstract run(id); 
} 

class TestExtension extends Test 
{ 
    constructor() { 
     super(); 
    } 

    public run(id) { } 
} 

class TestImplementation implements ITest { 
    constructor() { 

    } 

    public run(id) { } 
} 

zeigen beide falsch Intellisense, wo ich id erwartet von der Art ‚Zahl‘:

(method) TestExtension.run(id: any): void 
(method) TestImplementation.run(id: any): void 

I set-Methode Umsetzung natürlich public(id: number) { } sein kann, aber ich sehe nicht, warum ich habe mach das.

Kann mir bitte jemand aufklären?

Antwort

0

Ihr Verständnis von implements ITest ist ein bisschen in Ordnung. Die TypScript-Schnittstellenimplementierung ist nicht wie bei anderen Sprachen, es handelt sich lediglich um eine Kompilierzeit-Vertragsstatik, bei der die Mitglieder der Klasse mit der Schnittstellendefinition kompatibel sein müssen.

So wie folgt korrekt ist:

let foo: number; 
let bar; // inferred any 
foo = bar; 

die folgende ist auch richtig

interface IFoo { 
    foo: number 
} 
class Foo implements IFoo { 
    foo; // Inferred any 
} 

Das Funktionsargument ist auch jeder in Ihrem Code ohne eine explizite Unterschrift

Fix

Seien Sie explizit: public run(id) { } bis public run(id: number) { } Und optional kompilieren mit noImplicitAny, wenn Sie möchten, dass der Compiler diese Fälle für Sie abfängt

+0

Ich sehe, aber denken Sie nicht, es ist irgendwie seltsam, dass meine abstrakte Klasse und abstrakte Methode, die keine Implementierung hat, noch in die ausdehnende Klasse? Ich muss dann ein wenig anders über Typescript denken – Lostfields