2016-04-06 5 views
13
@xxx("xxx") 
class A{ 
    msg:string 
    constructor(msg:string) { 
     this.msg = msg 
    } 
    print() { 
     console.log(this.msg) 
    } 
} 

function xxx(arg:string) { 
    function f(target) { 
     function ff(msg: string) { 
      return new target(arg + ":" + msg) 
     } 
     return ff 
    } 
    return f 
} 

let a = new A("hellow") 
a.print() 

Po kompilacji, to raporty:maszynopis raporty dekorator "Nie można rozwiązać podpis klasy dekoratora, gdy nazywa się wyrazem"

decorator.ts (1,1): error TS1238: Nie można rozwiązać podpis dekoratora klasy, gdy jest nazywany jako wyrażenie. Typ '(msg: string) => any' nie można przypisać 'void'.

Ale genography JS wykonane dobrze. Nie wiem, dlaczego zgłosiłem błąd.

+5

Upewnij się również, że wywołujesz '@Input()' z nawiasem '()', ponieważ jest to funkcja. – STEEL

Odpowiedz

6

Kompilator oczekuje Twój dekorator albo unieważnione lub zwrócić wartość, która jest zgodna z A. widzi, że zwróci (msg:any) => any ale nie można wyciągnąć wniosek, że funkcja ta jest zgodna z A.

jeśli aby pozbyć się tego błędu, można rzucać ff dowolnego kiedy go zwrócić, a może nawet do typeof A komunikować intencją wyraźniej:

function xxx(arg: string) 
{ 
    function f(target) 
    { 
     function ff(msg: string) 
     { 
      return new target(arg + ":" + msg) 
     } 
     return <typeof A><any>ff 
    } 
    return f 
} 

powiedział, że to chyba nie jest dobry pomysł, aby zastąpić zajęcia w ten sposób powinieneś przynajmniej zachować konstruktora:

TypeScript documentation:

UWAGA Jeżeli zdecydowali się powrócić nową funkcję konstruktora, trzeba zadbać, aby zachować oryginalny prototyp. Logika, która zastosuje dekoratory w środowisku wykonawczym, nie zrobi tego za Ciebie.

+0

Dziękuję bardzo. Technika odlewania była dokładnie tym, czego potrzebowałem. Nie potrzebowałem podwójnego rzucania z , było wystarczające. Zrobiłbym ci dwa razy, gdybym mógł. –

+0

Jak to zrobić w sposób ogólny? Jeśli muszę rzucić klasę, umieszczam dekoratora na tym, w jaki sposób rzutować na typ, w którym dekorator został umieszczony bez twardego kodowania typu? – chubbsondubs

+0

@ Chubbsondubs Chciałem to również zrobić, ale nie sądzę, żebym znalazł wtedy jakieś rozwiązanie. Może teraz mamy nową składnię, nie wiem. Myślę, że jednym z problemów jest to, że typ konstruktora klasy nie ma odniesienia do typu klasy: https://github.com/Microsoft/TypeScript/issues/3841 – Alex

Powiązane problemy