2017-05-23 3 views
2

を削除するフローでたぶん(NULL可能)型の配列をフィルタリング私はたぶん(NULL可能)の配列を持っているが、私は唯一の非null値を含む配列を持っているものをnull年代をフィルタリングする、入力します。null値

11: .map(({ foo }) => foo); 
      ^property `foo`. Property cannot be accessed on possibly null value 

flow.org/try上のコードを参照してください。

@flow 

type Foo = { 
    foo: string 
} 

const bar: Array<?Foo> = [ null, { foo: 'Qux' } ] 

const baz = bar 
    .filter(x => x != null) 
    .map(({ foo }) => foo); 

しかし、流れは、それが明確にすることはできませんが、引数が、まだnullことができることを不平を言います

配列にnull値を設定できない項目しか含まれていないことをフローに伝える方法はありますか?

これは機能するJavaScriptプログラミングを破壊します。

答えて

2

クイック答え

null年代をフィルタリングする.filter(Boolean)を使用してください。

const baz = bar 
    .filter(Boolean) // <- This is the trick 
    .map(({ foo }) => foo); 

flow.org/tryを確認してください。

説明(一種の)

フローは結果が得られた、と本当にあれば、すべてのnullの値が削除されたかfilterコールバック、中に何が起こるかを理解することが困難です。したがって、フィルタリング後に配列の型が同じであるとみなします。実際には正しいですが、それは配列のサブセット、したがってその型のサブセットにしかなりません。なぜなら、それが動作する方法のとは対照的に

reduceタイプが推測されなければならないため、完全に異なる構造(flow.org/try)を作成:

const baz = bar 
    .reduce((prev, next) => next == null ? prev : [...prev, next], []) 
    .map(({foo}) => foo); 

しかし、このユースケースは、流れが含まれるように一般的ですits codeにおける例外:

filter(callbackfn: typeof Boolean): Array<$NonMaybeType<T>>; 
filter(callbackfn: (value: T, index: number, array: $ReadOnlyArray<T>) => any, thisArg?: any): Array<T>; 

Booleanがコールバックとして渡される(および場合のみ)場合に得られた配列はタイプArray<$NonMaybeType<T>>を有するであろうことを意味します。 Booleanは確実にnull(およびundefined)を削除し、信頼できる状態になります。

+0

これは_this_ケースで動作しますが、すべての "偽の"値を削除します。文字列の配列と同じものは空の文字列も削除しますが、 'undefined'値を持つブール値の配列を処理しようとしません:-)実際にはFlowがフィルター関数として単純な '==='(または 'instanceof')の比較を行います。 –