2017-01-18 2 views
0
verwendet wird

Der folgende Beispielcode wie erwartet funktioniert und druckt „[Funktion: Datum]“Typoskript Reflect.getMetadata (‚Design: Typ‘ ..) kehrt Objekt statt Datum, wenn die Winkel 2 Stapel

import 'reflect-metadata' 
function logType(target : any, key : string) { 
    var t = Reflect.getMetadata("design:type", target, key); 
    console.log(`${key} type: ${t.name}`); 
    } 
export class Demo { 
    @logType // apply property decorator 
    test: Date; 
} 
let demo = new Demo(); 
console.log(Reflect.getMetadata('design:type', demo, "test")); 

Wenn ich denselben Code innerhalb eines Angular 2-Projekts platziere, wird "function Object() {[native code]}" zurückgegeben.

bereitete ich eine Plunker dafür: https://plnkr.co/edit/DhXT89U0q5fCOWlCrx6w?p=preview

Reflect.getMetadata ('Design: Typ' ...) funktioniert nach wie vor für benutzerdefinierte Klassen und andere gebautet Klassen. Ich konnte dieses Problem nur mit Date erzeugen.

Was mache ich falsch?

+0

ich hatte das gleiche Problem jedoch nicht Angular verwenden. In meinem Fall beeinflusste die Einstellung "transspileOnly" des TypeScript-Loaders (ts-loader) die Ausgabe. Bei aktivierter Einstellung würde der Rückgabetyp Objekt anstelle von Datum sein. – rgarcia

Antwort

2

Sie haben die Funktion auszuführen, und nicht nur .. hat es dort :), Sie Klammern nach @logType

export class Demo { 
    @logType() // add parentheses 
    test: Date; 
} 

Auf der anderen Seite hinzufügen sollten Sie Ihre @logType Funktion zu so etwas wie dies ändern sollte:

function logType(type: any) { 
    return function(target: any, propertyKey: string) { 
    Reflect.defineMetadata('design:type', type, target, propertyKey); 
    } 
} 

Welche können Sie wie folgt aufrufen:

export class Demo { 
    @logType(Date) // apply property decorator 
    test: Date; 
} 

ich die plnkr aktualisiert haben zu zeigen, was ich meine: plnkr

Sie können nur erhalten entweder string, boolean, number oder object mit den Typen in-gebaut. Wobei object alles sein wird, von Date bis Array zu Ihrem Math und WeakMap. Alle Einbauten werten Object aus, ich bin mir nicht sicher, ob das ein Fehler ist oder ob es ein Designfehler ist.

Sie können Ihre Methode jedoch verwenden, um benutzerdefinierte Klassen zu erhalten. Wenn Sie

export class Demo { 
    @logType 
    test: Demo; 
} 

tun würde Es wird auszudrucken Demo

+0

Der Decorator braucht nicht(), in der Tat würde der Typskript-Compiler einen Fehler werfen, wenn er dies tut. Die Funktion wird auch aufgerufen (schauen Sie einfach in die Konsole des Plunkers) –

+0

Soweit ich weiß, ist es nicht möglich, den Typ nur mit '@ logType' zu ​​ermitteln, ohne den Typ tatsächlich zu übergeben. Ich habe meine Antwort aktualisiert, um zu bekommen, was Sie wollen. Aber ich könnte mich irren, es ist eine Weile her, seit ich Nachforschungen über Dekorateure angestellt habe, und die Spezifikation könnte sich geändert haben – PierreDuc

+0

Vielen Dank für Ihre Bearbeitung, ich werde versuchen, dies als Workaround zu verwenden. Normalerweise sollte die Compileroption emitDecoratorMetadata dieses https://www.typescriptlang.org/docs/handbook/decorators.html behandeln. Ich denke immer noch, dass es etwas anderes sein muss, da es wie erwartet funktioniert ohne eckige 2 –

Verwandte Themen