2016-04-20 14 views
0

Gegeben das folgende erfundene Codebeispiel, wobei T eine Function sein kann oder nicht, wie kann ich es in Typescript so umwandeln, dass ich es ausführen kann (vorausgesetzt, das ist überhaupt möglich)?Wie kann ich ein generisches in eine ausführbare Funktion umwandeln?

class Test<T> { 
    constructor(public value: T) {} 

    method() { 
     if (this.value instanceof Function) { 
      let fn = <Function>this.value; // [ts] Neither type 'T' nor type 'Function' is assignable to the other. 
      fn(); 
     } 
    } 
} 

let test = new Test(() => {}); 
test.method(); 

Wenn dies lösbar ist, kann ich es auch auf eine bestimmte Funktionssignatur anwenden, wie im Folgenden?

let fn: (input: T) => any = <(input: T) => Test<T>>this.value; 

Ich habe einen halb legitime Anwendungsfall für sie (kann Hintergrund hinzufügen, falls erforderlich), aber ich kann nicht helfen, aber frage mich, ob ich einen quadratischen Pflock durch ein rundes Loch hämmern.

Antwort

1

Weder Typ 'T' noch Typ 'Funktion' kann dem anderen zugewiesen werden.

Sie es mit einer doppelten Behauptung zwingen kann:

let fn = this.value as any as Function; 

Mehr

hier

Dies wird abgedeckt: https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html

Mehr

Kann ich die doppelte Behauptung verwenden mit einer Funktionsschnittstelle,

Sure:

let value: number; 
let fn = this.value as any as (input:string)=>any; 
+0

Interessant. Kann ich die doppelte Assertion mit einer Funktionsschnittstelle verwenden, ähnlich wie oben '(input: T) => Test '? – dvlsg

+0

@ dvlsg sicher. Antwort hinzugefügt – basarat

+0

Sieht gut aus, danke für die schnelle Antwort! – dvlsg

Verwandte Themen