2016-04-20 10 views
0

TFunctionである場合とそうでない場合がありますが、どのようにすれば実行できますか(これは可能であると仮定して)Typescriptでキャストできますか?genericを実行可能関数にキャストするにはどうすればよいですか?

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(); 

これを解決できるのであれば、次のように特定の関数シグネチャにもキャストできますか?

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

私は(必要に応じて、背景を追加することができます)そのための半合法的なユースケースがありますが、私は助けるが、私は丸い穴に四角いペグを打ってるかしらすることはできません。

答えて

1

「T」タイプも「Function」タイプも、どちらにも割り当てられません。あなたは二重のアサーションでそれを強制することができ

let fn = this.value as any as Function; 

もっと

これはここに覆われている:https://basarat.gitbooks.io/typescript/content/docs/types/type-assertion.html

もっと

が、私は二重のアサーションを使用することができますファンクションインタフェース、

確か:

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

興味深いです。上記の '(input:T)=> Test 'のような関数インタフェースでダブルアサーションを使用できますか? – dvlsg

+0

@dvlsg確かに。答えに – basarat

+0

が追加されました。素早く反応してくれてありがとう! – dvlsg

関連する問題