2017-09-27 53 views
0

我很難描述函數參數的類型,它可以是成功的,也可以是錯誤api響應。這裏的問題是(在this address在TryFlow再現)獲取區別聯合類型的錯誤(「在對象類型中找不到屬性」)

該函數可以採取任一個成功響應的對象或錯誤響應對象的簡單令人費解的例子:

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

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

應該然後決定哪一種反應的它是並通過響應於任一handleSuccesshandleError功能:

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 

錯誤消失如果代替聯合類型(SuccessResponse | ErrorResponse)I型響應對象作爲交叉點型(SuccessResponse & ErrorResponse),但是這不可能是正確的 - 我不能穿入onSubmit功能的對象,該對象具有全部兩種類型的屬性,但是可以是或者這兩種類型的論據。

你能解釋我在做什麼錯誤,並建議如何解決這種打字錯誤?

回答

2

你的問題是,流量不知道SuccessResponse是否有額外的error參數。

告訴流,它並沒有,你可以讓exact Object types

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

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

是的,這確實起作用。謝謝! – azangru

+0

@azangru不客氣! – MichaelDeBoey

0

要訪問聯合中所有類型都不通用的成員,必須給流程一種方法來查看它處理的是哪種類型。我知道您正在嘗試使用error的真實性來確定具體的類型,但流程並不理解這一點。

用於這種情況的模式流程被稱爲「不相交聯合」。在此描述:https://flow.org/en/docs/types/unions/

我不是流程的專家,但似乎一個解決辦法是修改您的類型定義爲SuccessResponse如下:

export type SuccessResponse = { 
    error: typeof undefined, 
    token: { 
    id: string, 
    } 
} 
相關問題