2017-04-22 8 views
3

ジェネリックマップ関数を記述しようとすると、構文エラーが発生します。Javascriptのフロージェネリック関数の構文

function mymap<A, B>(fun: (_: A) => B, array: Array<A>): Array<B> { 
    let result: Array<B> = []; 
    for (let i of array) 
     result.push(fun(i)); 
    return result; 
} 

let x = mymap<number, number>(x => x, [1, 2, 3]); 
          ^Unexpected token  

フロー:Unexpected token >と表示されます。私は間違って何をしていますか?ご協力ありがとうございました。

+0

7つの '>のうちのどれですか? – Bergi

+0

2番目の 'number'型宣言の後 – zyks

答えて

2

フローはタイプチェッカーのみです。汎用実装の型オーバーロードは許可されませんが、関数を呼び出すときは型を指定しないでください。フローは、関数のシグネチャとの互換性を確認するために引数をチェックし、出力の種類を差し引くだけです。だから、あなただけ

let x = mymap(x => x, [1, 2, 3]); 

を書く必要があるとフローは、式の出力タイプを控除してx変数に適用されます。

それとも、明示的xの種類を指定することができます

let x: Array<number> = mymap(x => x, [1, 2, 3]); 

この場合のフローが必要な型と控除のタイプを比較することができますが、あなたが誤ってx => x.toString()のような間違ったマッピング機能を使用する場合は、フローそれについてあなたに警告します:

let x: Array<number> = mymap(x => x.toString(), [1, 2, 3]); 
//   ^string   ^This type is incompatible with number 
+0

ありがとう、私は今それを理解しています。したがって、機能呼び出しをホモジニアスリストに限定する方法はありませんか?私。これはエラーを表示します: 'mymap(x => x、[1、 'b'、3]) ' – zyks

+1

これはFlowができないようです。ところで、TypeScriptでは、 'mymap (...)'の初期バージョンが動作します。 – artptr