2016-04-03 8 views
2

Ich frage mich warum, wenn ich Dekoratoren oder Anmerkungen in Typescript auf einer Klasse verwenden. Der Compiler kann den neuen Typ der Klasse nicht ableiten. Wenn ich keine Dekoratoren verwende und den alten Weg dafür in ES5 benutze (dh den Dekorator manuell aufrufen), funktioniert das offensichtlich.Typescript: Typ Inferenz bei der Verwendung von Dekorator

Zum Beispiel hier ein Beispiel, das das Problem zeigt:

function decorate(Target: typeof Base): IExtendedBaseConstructor { 
    return class extends Target implements IExtendedBase { 
    public extendedtMethod(): number { 
     return 3; 
    } 
    }; 
} 

interface IBase { 
    baseMethod(): number; 
} 

interface IExtendedBase extends Base { 
    extendedtMethod(): number; 
} 

interface IExtendedBaseConstructor { 
    new(): IExtendedBase; 
} 

@decorate 
class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const test = new Base(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // NOT OK, typescript think, Base is still Base but we decorated it. 

Mit der älteren Art und Weise, es funktioniert:

class Base implements IBase { 
    public baseMethod(): number { 
    return 5; 
    } 
} 

const ExtendedBase = decorate(Base); 

const test = new ExtendedBase(); 
test.baseMethod(); // OK 
test.extendedtMethod(); // OK 

Vielen Dank im Voraus.

+0

Was ist der Vorteil dieses Musters? Ist [dieser Code] (https://jsfiddle.net/pcyybdt7/1/) nicht viel einfacher zu verstehen? –

+0

Sie haben Recht. In diesem Fall ist dieses Muster nutzlos. Aber neue Front-End-Frameworks (wie angular2) haben entschieden, Dekorator anstelle von Vererbung zu verwenden, um neue Komponenten zu deklarieren. – Cnode

+0

Ich habe eine Bibliothek geschrieben, die dem Benutzer einen Helfer vorschlägt, um eine Klassen-API zu erstellen (mit einigen Parametern und nützlichen Methoden). Also habe ich eine abstrakte Api-Klasse erstellt, die Funktionalitäten und einen Dekorator bereitstellt, der die API über "Meta-Daten" in mein Framework einträgt. In diesem Fall mein Benutzer tun muss: 'import {AbstractAPI, Api} von 'MyLib' @Api (...) Klasse UserApi erweitert AbstractAPI {}' Meine Frage SO auch dazu verwandt ist. Wenn ich die Erweiterungen entfernen und alles in meinen Decorator '@ Api' zusammenführen könnte, würde dies den Tippfehler des Endbenutzers reduzieren. – Cnode

Antwort

2

Momentan funktioniert das nicht. Auf GitHub gibt es eine pending issue, damit Klassen-Dekoratoren den Typ der Klasse ändern können.

Ich würde empfehlen, die "alte Art" zu tun, die Sie erwähnten, bis dies implementiert ist.

Verwandte Themen