我很难描述函数参数的类型,它是成功或错误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);
}
问题是,Flow正在发出错误:
23: function handleError(response: ErrorResponse) {
^ property `error`. Property not found in
17: handleError(response);
^ object type
如果不是联合类型(SuccessResponse | ErrorResponse
),则错误消失我将响应对象键入为交集类型(SuccessResponse & ErrorResponse
),但这不是正确的 - 我没有进入onSubmit
函数是一个对象,它具有两种类型的所有属性,但参数可以是两种类型的 。
请您解释一下我做错了什么,并建议如何解决这个输入错误?
答案 0 :(得分:2)
您遇到的问题是Flow不知道SuccessResponse
是否有可能额外的error
参数。
要告诉Flow它没有,你可以exact Object types:
export type ErrorResponse = {|
error: {
message: string,
},
|}
export type SuccessResponse = {|
token: {
id: string,
},
|}
答案 1 :(得分:0)
要访问联合中所有类型不常见的成员,您必须为流提供一种方式来查看它正在处理的类型。我了解您正在尝试使用error
的真实性来确定具体类型,但流程并不理解这一点。
用于这种情况的模式流程用于称为"不相交的联合"。这里描述:https://flow.org/en/docs/types/unions/
我不是流量专家,但似乎有一个解决方案是修改SuccessResponse
的类型定义,如下所示:
export type SuccessResponse = {
error: typeof undefined,
token: {
id: string,
}
}