2016-04-06 14 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() 

Quando compilazione, riporta:dattiloscritto rapporti decoratore "Impossibile risolvere la firma di classe decoratrice quando viene chiamato come espressione"

decorator.ts (1,1): TS1238 errore: Impossibile risolvere firma di decoratore di classe quando chiamato come espressione. Digita '(msg: string) => any' non è assegnabile al tipo 'void'.

Ma il js genificato eseguito bene. Non so perché segnalare un errore.

+5

assicuratevi inoltre di chiamare '@Input()' con parentesi '()' dal momento che è una funzione. – STEEL

risposta

6

Il compilatore si aspetta il tuo decoratore a uno fosse nulla o restituire un valore che è compatibile con A. vede che ritorni un (msg:any) => any ma non può trarre la conclusione che questa funzione è compatibile con A.

Se vuole sbarazzarsi dell'errore, si può lanciare la FF a qualsiasi quando lo restituite, o forse anche per typeof A per comunicare l'intenzione chiara:

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

ciò detto, probabilmente non è una buona idea per sostituire le classi in questo modo, dovresti almeno mantenere il costruttore:

TypeScript documentation:

NOTA Nel caso si è scelto di restituire una nuova funzione di costruzione, è necessario fare attenzione a mantenere il prototipo originale. La logica che applica i decoratori in fase di esecuzione non lo farà per te.

+0

Grazie mille. La tecnica di fusione era esattamente ciò di cui avevo bisogno. Non avevo bisogno di raddoppiare il cast con , era sufficiente. Avresti due volte se potessi. –

+0

Come si fa in modo generico? Se devo lanciare il cast alla classe, metto il decoratore su come faccio a lanciare il tipo con cui è stato posizionato il decoratore senza dover codificare il tipo? – chubbsondubs

+0

@chubbsondubs Ho voluto farlo anche io, ma non credo di aver trovato alcuna soluzione a quei tempi. Forse ora abbiamo qualche nuova sintassi, non lo so. Penso che uno dei problemi è che il tipo di costruttore di una classe non ha riferimenti di tipo al tipo della classe: https://github.com/Microsoft/TypeScript/issues/3841 – Alex

Problemi correlati