2016-05-16 17 views
2

lodash.flow kombiniert zwei oder mehr Funktionen.Wie sollte die lodash-Flow-Funktion in Typoskript getippt werden?

lodash.flow(double, addTwo) würde eine Funktion zurückgeben die würde verdoppeln und zwei hinzufügen. Wie sollte diese Funktion in Typoskript eingegeben werden (die aktuelle Definition gibt nur Function zurück)?

declare function flow<In, Intermediate, Out>(f1: (a1: In) => Intermediate, f2: (a1: Intermediate) => Out): (a1: In)=> Out arbeitet für zwei Funktionen, wobei die erste ein Eingabeargument hat. Ich bin mir nicht sicher, wie ich die Definition auf alle Fälle erweitern kann.

Mein Versuch kann mulitple Funktionen unterstützen, wenn wie folgt aufgerufen:

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

aber ist für

lodash.flow(f1, f2, f3)

+0

Kann mir jemand sagen, warum das war downvoted? Wenn es falsch ist, kann es korrigiert werden? –

Antwort

2

Ich glaube nicht, Sie diese Definition schreiben können.

Wenn wir the lodash type declaration file betrachten, versuchen sie nicht, diese Beziehung auszudrücken.

Aber das allein ist nicht Grund genug, die Möglichkeit zu diskontieren. Die Autoren haben vielleicht etwas übersehen, also lasst uns weiter darüber nachdenken.

Die Beziehung zwischen einer einzelnen Funktionskette ist etwas, das Sie darstellen können. Sie haben das oben in Ihrem Beispiel getan. Sie könnten manuelle Versionen derselben Idee für mehrere Längen von Parametern erstellen, aber das liegt daran, dass Sie eine Situation einrichten, in der die Länge der Kette bekannt ist und Sie individuelle Typinformationen erteilen können.

Wenn wir den Fall variabler Länge Parameter behandeln, müssen wir die Parameter als Collection behandeln. Da alle Variablen einen einzigen (wenn auch möglicherweise parametrisierten) Typ haben müssen, muss auch dieses Auflistungsobjekt vorhanden sein. Die Typen der verschiedenen Funktionen sind jedoch nicht aufeinander abgestimmt. (param:A) => B ist nicht der gleiche Typ wie (param:B) => C und kann nicht im selben gut typisierten Container gespeichert werden (Sperrung von Unionstypen, aber diese werden auch nicht skaliert).

In Situationen, in denen Sie Typinformationen in einer Liste von Parametern beibehalten möchten, definieren Sie normalerweise die Kompositionsfunktion für zwei Parameter und wenden sie auf eine Reihe von Funktionen an. So werden zum Beispiel Typinformationen in Versprechungen festgehalten. Damit dies funktioniert, müssen Sie noch jeden einzelnen Parameter angeben. Es macht es nur so, dass Sie am Ende den richtigen Ausgabetyp haben. Das heißt, in den meisten Fällen ist das was du willst, also ist alles gut.

Wenn Lodash in einer gut typisierten funktionalen Sprache geschrieben würde, würde diese Flussfunktion wahrscheinlich nicht existieren. Ich stelle mir vor, es wäre stattdessen als Kompositionsobjekt geschrieben worden.

UPDATE: Was meine ich, wenn ich ein "Piped Composition Object" sage? Etwas wie das, vielleicht:

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

Was ist ein zusammengesetztes Kompositionsobjekt? –

+0

@ 2426021684 Ich aktualisierte meine Antwort mit einer, die ich gerade aufgepeitscht habe. Hilft das? – Paarth

+0

Ja, das hat geholfen, danke –

Verwandte Themen