2017-07-27 11 views
1
/* @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 codetypeに応じて、2つの他の機能のいずれかをディスパッチ機能(branch)を示します。すべての関数はBasePropsで宣言された共通数のプロパティを持つオブジェクトを受け取りますが、個々のディスパッチされた関数はそれぞれ、typeに依存するいくつかの余分なプロパティを処理します。これらの拡張オブジェクトは、BasePropsにエクストラを加えたものとして宣言されています。ジェネリック型は、すべての可能なオブジェクト型の互いに素な結合として宣言されます。ディスパッチ機能

これは私の問題の単純化されたバージョンですが、同じエラーが発生します。実際のケースでは、すべてレスキューステートレスコンポーネントなので、基本的には大文字の頭文字を持ち、JSXコンポーネントとして呼び出される点が異なります(<A props={props} />)。上記の単純化されたバージョンを示していますが、実際のJSXバージョンと同じエラーが報告されています。

私は、aとその引数を明示的に宣言する必要があると私は推測し、成功することなくいくつかの方法でそうしようとしています。実際のコードは、Flowを試してみる前と同じようにうまく動作します。

ありがとうございました。

答えて

0

私は解決策を見つけたので、今すぐ見ています。意味があります。私は、一般的なstringとしてジェネリック型BasePropstypeを宣言する必要があります。

type BaseProps = { 
    type: string, // <-- this was missing 
    commonProp1: number, 
    commonProp2: string, 
} 

は、文字列のみが特定の文字列値がそれのために許可されている、より具体的な型定義と互換性がないとしてとしてそれを宣言する。

関連する問題