2017-12-21 14 views
0

同じインタフェースで定義された関数型の2つのがシナリオです。複数の名前のない関数を持つ関数型

type InterfaceB<R, S> = (param1: S, param2: R) => R; 
interface InterfaceA<S> { 
    <R>(action: R): R; 
} 
interface InterfaceA<S> { 
    <R>(action: InterfaceB<R, S>): R; 
} 
const x: InterfaceA<string> =(): InterfaceA<string> => { 
    var a1: (action: number) => number = (action: number) => { return 1; }; 
    var a2: (action: (p: string, p2: number) => number) => number = (action: (p: string, p2: number) => number) => { return 2; }; 
    return { a1, a2 } as any; 
}; 


const result = x("This should take the (action:R) signature since it's a single value") 
console.log(result); 

コードはコンパイルしますが、いくつかの問題がありますキャストas anyを回避する方法は、

  1. ありますか?
  2. xが呼び出されたとき、VsCodeは右の2つのオーバーロードを示しますが、2つの関数のどちらも呼び出されず、結果は2つのオブジェクトを持つオブジェクトリテラルです(これは私が返すものなので意味があります)。変更には何が必要ですか?そのようなインターフェースの

enter image description here

+0

達成しようとしていることを具体的に説明できますか?予想されるアウトプット/ビヘイビアは?また、ジェネリックパラメータを定義して使用しても意味がありません(最初の関数 'Interface InterfaceA { (処置:R):R; })) –

+0

この例は、Redux Dispatchの簡略版です。あなたがindex.d.tsを見ると、Dispath は(Tを直接使用することなく)同じようにジェネリックを使用していることがわかります。この例では、Reduxの定義ファイルにDispatchの2番目の定義を追加するRedux-Thunkライブラリの組み合わせで、ReduxのDispatchを単純化しています。 –

答えて

関連する問題