/* @flow */
type BaseProps = {
commonProp1: number,
commonProp2: string,
}
type Type1Props = BaseProps & {
type: 'type1',
extraProp1: boolean,
}
type Type2Props = BaseProps & {
type: 'type2',
extraProp2: number,
}
type Type = Type1Props | Type2Props;
function dealWithType1({ props }: {props: Type1Props}) {
console.log('common prop 1', props.commonProp1);
console.log('type1 extra prop', props.extraProp1);
}
function dealWithType2({ props }: {props: Type2Props}) {
console.log('common prop 1', props.commonProp1);
console.log('type2 extra prop', props.extraProp2);
}
function branch({ props }: { props: Type }) {
const a = {
type1: dealWithType1,
type2: dealWithType2,
}[props.type];
return a({props});
}
above code性type
に応じて、2つの他の機能のいずれかをディスパッチ機能(branch
)を示します。すべての関数はBaseProps
で宣言された共通数のプロパティを持つオブジェクトを受け取りますが、個々のディスパッチされた関数はそれぞれ、type
に依存するいくつかの余分なプロパティを処理します。これらの拡張オブジェクトは、BaseProps
にエクストラを加えたものとして宣言されています。ジェネリック型は、すべての可能なオブジェクト型の互いに素な結合として宣言されます。ディスパッチ機能
これは私の問題の単純化されたバージョンですが、同じエラーが発生します。実際のケースでは、すべてレスキューステートレスコンポーネントなので、基本的には大文字の頭文字を持ち、JSXコンポーネントとして呼び出される点が異なります(<A props={props} />
)。上記の単純化されたバージョンを示していますが、実際のJSXバージョンと同じエラーが報告されています。
私は、a
とその引数を明示的に宣言する必要があると私は推測し、成功することなくいくつかの方法でそうしようとしています。実際のコードは、Flowを試してみる前と同じようにうまく動作します。
ありがとうございました。