2017-11-09 18 views
0

は、それらの両方がid性を有する、2つのデータ型を有する想像:FlowType:複数種類の一般的な遺伝

type Foo = { 
    id: string, 
    // other props 
} 

type Bar = { 
    id: number, 
    // other props 
} 

次にプロパティとしてデータの配列を受け入れ反応させにおけるTable成分を想像します。このコンポーネントは汎用である必要がありますが、データ配列内のすべてのデータオブジェクトに対してidの小道具が必要であることがわかりました。このidは、数値または文字列のいずれかです。小道具は次のようにタイプされるかもしれません:

type Props = { 
    data: Array<{id: number | string}> 
} 

上記の表記は機能しません。特定のプロパティを「再入力」できる方法はありますか?

私はgeneric typesに見ているが、私はFooBar型定義を変更することなく、解決策を見つけるように見えることはできません。

+0

あなたは –

+0

あなただけの組合 'タイプU =はFooを探しています(https://flow.org/try/)[フロー試してみてください]でこのエラーを再作成することができます| Bar '、次に 'Array '? – ftor

答えて

0

これはFlowにとって私が思うところではややこしいことです。したがって、両方の型が共有する1つのプロパティを宣言する代わりに、配列をFoo | Barという型として宣言することができます。

これは元のコードよりも繰り返し回数が少なく、そのifステートメントの各ブランチで、他のユニークなプロパティFooまたはBarに何ら問題なく自由にアクセスできます。

// @flow 

type Foo = { 
    id: string, 
    // other props 
} 

type Bar = { 
    id: number, 
    // other props 
} 

type Props = { 
    data: Array<Foo | Bar> 
} 

const foo: Foo = { id: 'A' } 
const bar: Bar = { id: 1 } 
const props: Props = { data: [foo, bar] } 

for (const item of props.data) { 
    if (typeof item.id === 'string') { 
    console.log('I am a Foo') 
    } else { 
    console.log('I am a Bar') 
    } 
} 

Try Flow Link

+0

これは解決策です。しかし、このアプローチの欠点は、新しいタイプのデータをプッシュするたびに、 'Table'コンポーネントのタイプ定義を更新する必要があることです。データ型と 'Table'コンポーネントがあまり緊密に結合されていないもっと一般的なアプローチが好きです。 – hannesbelen

+2

@hannesbelenつまり、異なる型の値に関連付けられた 'id'プロパティを持つレコード型が必要ですか?これはもはやほとんどタイプではありません。あなたはタイプを持つことはできませんし、同時にそれらを持っていることはできません。 – ftor

+1

@hannesbelen次に新しい型を作ることができる 'type TableItem = Foo | Bar'とし、 'Table'プロップは' data:Array 'になります。今あなたの型ファイルでは、 'TableItem'であることが許されている全てのアイテムを最新の状態に保つだけです。どのような型が許可されているかを明示する必要があります。 –

関連する問題