2017-09-27 9 views
0

成功またはエラーAPI応答のいずれかの関数引数のタイプを説明するのが苦労しています。ここでは関数が成功応答オブジェクトまたはエラーレスポンスオブジェクトのいずれかを取ることができユニオンタイプを識別するエラーを取得する(「オブジェクトタイプにプロパティが見つかりません」)

this addressでTryFlowで再現)問題の簡単な不可解な例である:

export type ErrorResponse = { 
error: { 
    message: string, 
} 
} 

export type SuccessResponse = { 
token: { 
    id: string, 
} 
} 

それは、応答の種類を決定する必要がありますそれはいずれかhandleSuccess又はhandleError機能に対する応答を渡す:

function onSubmit(response: SuccessResponse | ErrorResponse) { 
    if (response.error) { 
    handleError(response); 
    } else { 
    handleSuccess(response); 
    } 
} 

function handleError(response: ErrorResponse) { 
    console.log(response.error.message); 
} 

function handleSuccess(response: SuccessResponse) { 
    console.log(response.token.id); 
} 

問題は、フローは、エラーを与えている:

23: function handleError(response: ErrorResponse) { 
           ^property `error`. Property not found in 
17:  handleError(response); 
        ^object type 

代わりにunion型(SuccessResponse | ErrorResponse)の私は、交差点の種類(SuccessResponse & ErrorResponse)とレスポンスオブジェクトを入力し、それが正しいことができない場合は、エラーが消える - 私はonSubmit関数にそのオブジェクトを渡しておりませんすべて両方の型のプロパティがありますが、のいずれかの2種類ののいずれかの引数があります。

私が間違っていることを説明し、このタイプミスを修正する方法を教えてください。

答えて

2

あなたが得る問題をということであるフローSuccessResponseに可能な余分なerror paramがあるかどうかはわかりません。トリックをした

export type ErrorResponse = {| 
    error: { 
    message: string, 
    }, 
|} 

export type SuccessResponse = {| 
    token: { 
    id: string, 
    }, 
|} 
+0

うん、:それは、あなたがexact Object typesを作ることができないことフローを伝えるために

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

+0

@azangruよろしくお願いします! – MichaelDeBoey

0

ユニオンのすべてのタイプに共通ではないメンバーにアクセスするには、どのタイプのものが処理されているかを確認する方法をフローに与える必要があります。特定のタイプを判断するために真実度errorを使用しようとしていることを理解していますが、フローでこれを理解できません。

このような状況でのパターンフローの使用を「分離型ユニオン」と呼びます。 https://flow.org/en/docs/types/unions/

私は流れの専門家ではないんだけど、それは次のように一つの解がSuccessResponseのためのあなたのタイプの定義を変更することになりそうです:ここで説明されて

export type SuccessResponse = { 
    error: typeof undefined, 
    token: { 
    id: string, 
    } 
} 
関連する問題