2017-07-17 22 views
0

たぶん私は、次のタイプがあります。今フロータイプ:フロータイプに基づいてオブジェクトのプロパティ名を取得します

declare interface SomeClass { 
    x?: ?number; 
    y?: ?string; 
} 

は、私は、バックエンドの呼び出しからフェッチされるオブジェクトSomeObjectの、このタイプを適用します。問題は時々返される値は、このようなものになるだろう、次のとおりです。

{ "x": 1, "y": "Some String", "z": "Additional Payload" } 

質問です:どのように私はフローを使用してこれらのいわゆる追加のペイロードを削除ことができますか?またはこれは不可能ですか?

+0

なぜ '?'を 'x'と' y'キーで使用しますか? 'z'キーが表示されることがあります。 –

+0

よく、キー 'z'を削除する必要があります。そして時々、 'z1'、' z2'などのような追加のキーがあります。私が望むのは、 'x'と' y'だけを含むきれいなオブジェクトです。フローを使用してこれを行うことはできますか?それとも別のものを試すべきですか? –

+0

私は、オブジェクトから目的のキーを選択するだけでよいと思います。フローにはこのような機能はありません。 –

答えて

0

フローは、JavaScriptコードを静的に記述するタイプレベルの言語です。実行時の効果はなく、コードの意味は変わりません。つまり、(正しくタイプされた)プログラムからFlowアノテーションを削除すると、まったく同じように実行されます。これは、Flowの設計目標の1つであり、TypeScriptのような言語とは区別されます。

Flowを使ってオブジェクトの構造を変更することはできません。あなたがオブジェクトのみ特定のフィールドを持つタイプを割り当てる場合は、フローは、あなたがになっていなかったフィールドを使用していないことを確認して助けることができます。

type MyType = { 
    x?: ?number, 
    y?: ?string 
} 
let foo: MyType = { "x": 1, "y": "Some String", "z": "Additional Payload" }; 

foo.z; // ERROR! Even though z is there, it's not part of MyType 

をしかし、あなたがそれになりたいと言ってみましょう以前より厳格化されており、割り当てに追加のプロパティは許可されません。あなたは、他のフィールドが許可されないことを示すために{| .. |}を使用することができます:それは外部ソースからのものである場合、それが到着すると、あなたはまだデータをチェックする必要があります

type MyType = {| 
    x?: ?number, 
    y?: ?string 
|} 
let foo: MyType = { "x": 1, "y": "Some String", "z": "Additional" }; // ERROR! 

注意。フローはコンパイル時の情報のみを使用できます。

1

いいえ、追加のペイロードをフローで削除することはできません。フローは静的型チェッカーのみであり、すべてのフローステートメントは実行可能なJavaScriptファイル用に削除されます。しかし、そのようなものを使ってペイロードの残りを削除することができます:

const { x, y } = object; 
object = { x, y };