2016-09-18 8 views
5

私は、JavaScriptプロジェクトにFlowを追加しています。オブジェクトのフロータイプ

いくつかのケースでは、私はこのようなことをします、私はオブジェクトを持っています。

私は、キーを保持しながら値を置き換える、オブジェクトにマッピングを行う一般的な関数を持っています。

function enfunctionate(someObject) { 
    return _.mapValues(myObject, (value) =>() => value) 
} 

私はこれを実現するための方法はありタイプ{x:() => number, y:() => string}を返す関数が欲しいですか?

もちろん、一般的には{[key: string]: any}と入力することができますが、フローを使用して静的なタイピングをたくさん失うことになります。

コード生成や動作可能なマクロでこれを行う少数のケースを置き換えることができますが、フローでそれを行うには良い方法はありません。

この問題を解決する方法はありますか?

+0

を使用することができますv.33から始まるが、あなたはここで見ることができますhttps://docs.omniref.com/js/npm/lodash-node/3.1.0/symbols/_.mapValues 'mapValues'は' any'を受け取り、**コピー**を返します。 *タイプ*です。 – Hitmands

+0

[同じキーで異なる値の型の入出力オブジェクトを持つ関数を入力するにはどうすればよいですか?](http://stackoverflow.com/questions/35894181/how-do-i-type-a-function -with-input-and-output-objects-with-same-keys-but-di) –

答えて

4

それはany

function enfunctionate<O: Object>(someObject: O): { [key: $Keys<O>]: (...rest: Array<void>) => any } { 
    return _.mapValues(someObject, (value) =>() => value) 
} 

const obj = enfunctionate(myObject) 

obj.x() // ok 
obj.unknown() // error 

EDIT関与まだあります{[key: string]: any}よりも安全ですがこれは、あなたが現時点で得ることができる最高です:あなたがしたよう$ObjMap

function enfunctionate<O>(o: O): $ObjMap<O, <V>(v : V) =>() => V> { 
    return _.mapValues(o, (value) =>() => value) 
} 
+0

それは知事ではなく、私が持っていたものよりずっと良かった、ありがとう! –

+1

新しい実装(v0.33 +)を追加しました。 – gcanti

+0

素晴らしい!これについてどうやって見つけましたか?どこかに書類はありますか? –

0

フローは多くのことを推測できます。ただし、型を固定する場合は、型を自分で作成する必要があります。渡すオブジェクトの型をenfunctionateに作成し、返される型を指定する必要があります。

type aliasで関数を入力できます。したがって、その関数の新しい明示的な型を作成することができます。

function enfunctionate<X, Y>(x: X): Y { 
    return _.mapValues(myObject, (value) =>() => value) 
} 

は、限り、あなたはXの種類を知っているように、あなたはY.タイプエイリアシング、ジェネリック医薬品の種類を知っている、と組合はあなたが必要な柔軟性を与えることができるはずです。

の型が正しく指定されていれば(他の人もうまくいけば)、enfunctionateの型を指定するだけで、その関数の戻り値の型を推測できるようになります。 。

+0

ありがとうございますが、本当に私を助けません。私がタイプしようとしている関数は、定型文を排除するために存在するので、型を定義する必要がある場合、実際には役に立ちません。また、_.mapValuesは同じタイプ入力の問題に直面しているので、問題をプッシュすると何も役に立ちません。 –

関連する問題