2016-10-16 7 views
3

flowtypeで分離した結合を絞り込むためにオンラインで見つかったすべての例は、the official oneなどの文字列リテラルを使用します。私のような列挙型から値に対してチェックする方法があるかどうかを知りたい:リテラル文字列を使用してフロー内の個別化された共用体を絞り込む方法

const ACTION_A = 'LITERAL_STRING_A'; 
const ACTION_B = 'LITERAL_STRING_B'; 

type ActionA = { 
    // This is not allowed 
    type: ACTION_A, 
    // type: 'LITERAL_STRING_A' is allowed 
    dataA: ActionAData, 
} 

type ActionB = { 
    // This is not allowed 
    type: ACTION_B, 
    // type: 'LITERAL_STRING_B' is allowed 
    dataB: ActionBData, 
} 

type Action = ActionA | ActionB; 

function reducer(state: State, action: Action): State { 
    // Want to narrow Action to ActionA or ActionB based on type 
    switch (action.type) { 
    // case 'LITERAL_STRING_A': -- successfully narrow the type 
    case ACTION_A: // doesn't work 
     // action.dataA is accessible 
     ... 
    } 
    ... 
} 

文字列は型注釈として不適格であるため、残念ながら、あなたがこれらの操作を行うことはできません。

これ以外の方法で文字列リテラルを入力する必要がない場合は、どこでも知りたいと思います。

回避策がない場合は、これらの分離セットをレビュックスアクションに定義する必要がない方法を、より高いレベルで受け入れます。

答えて

0

私はあなたの質問を間違って読んだ場合、申し訳ありません。とにかく助けようとします。これはあなたが探しているものですか?

const actionTypes = { 
    FOO: 'FOO', 
    BAR: 'BAR' 
} 

type ActionType = $Keys<actionTypes> // one of FOO, BAR 

function buzz(actionType: ActionType) { 
    switch(actionType) { 
    case actionTypes.FOO: 
     // blah 
    } 

これは動作するはずです。申し訳ありませんが、私の構文が少しオフです。

あなたがすべての行動のタイプをリストすることを避ける方法を尋ねる場合は、ごめんなさい、私はあなたがそれを行う方法だと思います。

type Action = 
    | ActionA 
    | ActionB 
    | ActionC 

また、あなたは個々のアクションタイプを必要としない場合、あなたはちょうど私が

type Action = 
    | {type: ACTION_A; dataA: ActionAData;} 
    | {type: ACTION_B; dataB: ActionBData;} 
+0

だっ行うことができます:私が正しくリコール場合は、長い労働組合を定義するための少しよりよい構文が最近の流れでご紹介しましたアクションタイプをActionAタイプまたはActionBタイプに絞り込むことを尋ねる。そうすれば、私は、各サブタイプのフィールドに、不平を言うことなくフィールドにアクセスできるようになります。例ではリテラル文字列を使っていることがわかりますが、可能であれば列挙型で知りたいのです – xvaldetaro

+0

@xvaldetaroああ、私は質問を更新してくれてありがとう。それは変だ。定数によるリファインは、文字列リテラルによるリファインと同じように機能するはずです。おそらく 'type:typeof ACTION_A'が動作するでしょうか? – Nikita

関連する問題