我很难描述函数参数的类型,它是成功响应或错误api响应 . 以下是该问题的一个简单令人费解的例子(在TryFlow中重现this address)
该函数可以采用成功响应对象或错误响应对象:
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
函数传递给具有 all 属性的对象类型,但可以是两种类型的 either 的参数 .
你能解释我做错了什么,并建议如何解决这个打字错误?
2 回答
你得到的问题是Flow不知道
SuccessResponse
是否有可能的额外error
参数 .要告诉Flow它没有,你可以制作exact Object types:
要访问联合中所有类型不常见的成员,您必须为流提供一种方法,以查看's dealing with. I understand that you'尝试使用
error
的真实性来确定特定类型,但流程不理解这一点 .用于这种情况的模式流用途称为"disjoint unions" . 它在这里描述:https://flow.org/en/docs/types/unions/
我不是流量专家,但似乎一个解决方案是修改
SuccessResponse
的类型定义,如下所示: