2016-05-16 8 views
2

lodash.flowは、2つ以上の機能を組み合わせています。lodashフロー関数はtypescriptでどのように入力する必要がありますか?

lodash.flow(double, addTwo)は、2倍と2を加算する関数を返します。この関数はtypescriptでどのように型付けされるべきですか(現在の定義は単にFunctionを返します)?

declare function flow<In, Intermediate, Out>(f1: (a1: In) => Intermediate, f2: (a1: Intermediate) => Out): (a1: In)=> Outは、最初の入力引数を持つ2つの関数で動作します。すべての場合に定義をどのように拡張するかはわかりません。

私の試みは、このように呼ばれる場合mulitple機能をサポートすることができます

lodash.flow(f1, lodash.flow(f2, f3))

が、私はあなたがその定義を書くことができるとは思わない

lodash.flow(f1, f2, f3)

+0

誰が私にこのdownvotedの理由を教えてもらえますか?それが間違っている場合は、修正することはできますか? –

答えて

2

を探しています。

the lodash type declaration fileを見ると、その関係を表現しようとはしません。

interface LoDashStatic { 
    flow<TResult extends Function>(...funcs: Function[]): TResult; 
} 

しかし、それだけでは、その可能性を割り引くには十分ではありません。著者はちょっと見落としたかもしれないので、それについて考えてみましょう。

個々の機能チェーンの関係は、表現できるものです。あなたは上のあなたの例でそうしました。あなたは、チェーンの長さがわかっていて、個々のタイプ情報を与えることができる状況を設定しているので、同じ考え方のマニュアルバージョンをいくつかの長さのパラメータに対して作成することができます。

可変長パラメータの場合を処理する場合は、パラメータをコレクションとして処理する必要があります。すべての変数は1つの(おそらくパラメータ化されていますが)型でなければならないので、このコレクションオブジェクトも必要です。ただし、さまざまな関数の型は整列しません。 (param:A) => B(param:B) => Cと同じタイプではなく、同じタイプのコンテナに格納することはできません(ユニオンタイプは禁止されていますが、どちらもスケールされません)。

このようなパラメータのリストに型情報を保持したい場合は、通常、2つのパラメータで構成関数を定義し、多数の関数に適用します。これは、タイプ情報が約束で保持される方法です。これが機能するためには、各個別のパラメータを綴る必要があります。最終的には適切な出力タイプが得られます。それは、ほとんどの場合、これはあなたが欲しいものなので、それはすべての良いです。

lodashが型付き関数型言語で記述されている場合、そのフロー関数はおそらく存在しません。私はそれが代わりにパイプされた構成オブジェクトとして書かれていたと思います。

UPDATE:「パイプ合成オブジェクト」とはどういう意味ですか?おそらく、次のようなものでしょう:

class FunctionComposer<T,V> { 
    constructor(protected func: (param: T) => V) { } 

    public compose<X>(newFunc: (param:V) => X) { 
     return new FunctionComposer((x: T) => newFunc(this.func(x))); 
    } 
    public out() { 
     return this.func; 
    } 
} 

let composedFunc = new FunctionComposer((x: number) => x * 2) 
    .compose(x => x.toString()) 
    .out(); 

// composedFunc has type (param:number) => string 
+0

パイプされた合成オブジェクトとは何ですか? –

+0

@ 2426021684私はちょうどホイップアップで私の答えを更新しました。それは役に立ちますか? – Paarth

+0

はい、助けてくれてありがとう –

関連する問題