2017-06-22 10 views
1

は、このコードを検討定義されている未定義の値をチェックします:フローは、私はすでに

/* @flow */ 
type ActionType = string 
type ActionPayload = * 
type ActionError = true 
type ActionMeta = * 

type Action = {| 
    type: ActionType, 
    payload?: ActionPayload, 
    error?: ActionError, 
    meta?: ActionMeta 
|} 

export function action (type: ActionType, payload?: ActionPayload): Action { 
    const action: Action = { type } 

    if (payload) { 
    action.payload = payload 
    } 

    return action 
} 

function login (email, password) { 
    return action('LOG_IN', { email, password }) 
} 

const loginAction = login('[email protected]', '12345678') 

loginAction.type 
loginAction.payload.email 
loginAction.payload.password 
を フローは最後の2行に私にエラーを与えている

:私は明らかに渡している

31: loginAction.payload.email 
         ^property `email`. Property cannot be accessed on possibly undefined value 
31: loginAction.payload.email 
    ^undefined 
32: loginAction.payload.password 
         ^property `password`. Property cannot be accessed on possibly undefined value 
32: loginAction.payload.password 
    ^undefined 

emailpasswordの値では、loginAction.payloadのチェックでこれらの2つの値を折り返さないようにする方法を理解できません。

質問は:loginAction.payloadの確認を避けても問題がありますか?どうやって?

interactive versionここにコードを編集できます。

答えて

1

Flowは、すべてのコードを調べて、nullではないことを知ることはできません。試してみると極端に遅くなり、最終的には非決定論的になり、Halting Problemに遭遇することさえあります。実用的な理由から、描画される線は、Flowが関数境界で与えられた型だけをチェックするということです。

Actionタイプでは、​​はnullまたは不足であることが宣言されています。 action()の引数としてNULL以外のペイロードを指定していても、の内部にはというボディがあり、この引数は常にActionの​​になることを理解するにはaction()の本文を理解する必要があります。それはしません - それは署名を見て、Actionが返され、Actionがnull​​を持つかもしれないという結論だけを描きます。

このための可能な解決策を作るのではなく、非nullであるかの引数に応じて、複数のコンストラクタを使用することです​​オプションaction()中:

export function actionWithPayload(type: ActionType, payload: ActionPayload): {...Action, payload: ActionPayload} { 
    const action: Action = { type, payload } 
    return action 
} 

const loginAction = actionWithPayload('[email protected]', '12345678') 

loginAction.type 
loginAction.payload.email 
loginAction.payload.password 

これが機能するようになりましたので、その署名でactionWithPayload保証こと​​が存在します。

関連する問題