获取区别联合类型的错误(“在对象类型中找不到属性”)

问题描述:

我很难描述函数参数的类型,它可以是成功的,也可以是错误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功能的对象,该对象具有全部两种类型的属性,但是可以是或者这两种类型的论据。

你能解释我在做什么错误,并建议如何解决这种打字错误?

你的问题是,流量不知道SuccessResponse是否有额外的error参数。

告诉流,它并没有,你可以让exact Object types

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

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

是的,这确实起作用。谢谢! – azangru

+0

@azangru不客气! – MichaelDeBoey

要访问联合中所有类型都不通用的成员,必须给流程一种方法来查看它处理的是哪种类型。我知道您正在尝试使用error的真实性来确定具体的类型,但流程并不理解这一点。

用于这种情况的模式流程被称为“不相交联合”。在此描述:https://flow.org/en/docs/types/unions/

我不是流程的专家,但似乎一个解决办法是修改您的类型定义为SuccessResponse如下:

export type SuccessResponse = { 
    error: typeof undefined, 
    token: { 
    id: string, 
    } 
}