2017-01-06 22 views
4

私は不可能を達成しようとしているかもしれないが、ここに行く。渡された関数からの戻り値の型戻り型

Iは

例えば機能Aのパラメータに渡される新しい機能と同じ型を返す関数(機能A)を定義します

export function test<T> (arg:Function):T { 
    return arg; 
} 

function a():string { 
    return 'a'; 
} 

function b():number { 
    return 0; 
} 

let aVal:string = test(a); 
let bVal:number = test(b); 

明らかに、私はいくつかのコンパイル時エラーに対して自分の応答を強く入力することができます。

私はただ夢を見ている人はいないと思っています。

**注:この程度のコードはデモのために一緒に平手打ち**

乾杯

答えて

2

どのように?代わりに、我々は引数を取らず、T型、その後に渡された関数で定義することができます実際の型Tの何かを返す関数としてargを定義した関数インタフェースを使用しての

function test<T>(arg:() => T): T { 
    return arg(); 
} 

function a(): string { 
    return 'a'; 
} 

function b(): number { 
    return 0; 
} 

let aVal: string = test(a); 
let bVal: number = test(b); 

+0

これはすばらしいことですが、関数自体を定義することなく、そのような関数シグネチャを定義できることはわかりませんでした。ありがとう –

+0

うん..私たちが定義したのは、パラメータを取らず何かを返す関数であることが期待される関数パラメータです。それで全部です。 :) – toskv

+0

まさに私が必要なもの –