Javascript 识别联合类型时出错(“在对象类型中找不到属性”)
我很难描述函数参数的类型,它要么是成功的,要么是错误的api响应。下面是这个问题的一个简单而令人困惑的例子(转载于TryFlow at) 函数可以接受成功响应对象或错误响应对象:Javascript 识别联合类型时出错(“在对象类型中找不到属性”),javascript,flowtype,Javascript,Flowtype,我很难描述函数参数的类型,它要么是成功的,要么是错误的api响应。下面是这个问题的一个简单而令人困惑的例子(转载于TryFlow at) 函数可以接受成功响应对象或错误响应对象: export type ErrorResponse = { error: { message: string, } } export type SuccessResponse = { token: { id: string, } } 然后,它应该决定它是哪种响应,并将响应传递给handleSuc
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);
}
问题是,流给出了一个错误:
23:函数句柄错误(响应:错误响应){
^属性“错误”。在中找不到属性
17:handleError(响应);
^对象类型
如果我将响应对象键入交叉点类型(SuccessResponse&ErrorResponse
),而不是联合类型(SuccessResponse&ErrorResponse
),则错误消失,但这不可能是正确的-我没有向onSubmit
函数传递一个对象,该对象具有两种类型的所有属性,而是一个参数,可以是这两种类型中的之一
请您解释一下我做错了什么,并建议如何修复此键入错误?若要访问联合中并非所有类型都通用的成员,您必须为flow提供一种查看其处理的类型的方法。我知道您试图使用
error
的真实性来确定特定类型,但flow没有他不明白这一点
这种情况下使用的模式流称为“不相交的并集”。如下所述:
我不是流量方面的专家,但一个解决方案似乎是修改SuccessResponse
的类型定义,如下所示:
export type SuccessResponse = {
error: typeof undefined,
token: {
id: string,
}
}
要访问联合中并非所有类型都通用的成员,您必须为flow提供一种查看其处理的类型的方法。我知道您试图使用
error
的真实性来确定特定类型,但flow不理解这一点
这种情况下使用的模式流称为“不相交的并集”。如下所述:
我不是流量方面的专家,但一个解决方案似乎是修改SuccessResponse
的类型定义,如下所示:
export type SuccessResponse = {
error: typeof undefined,
token: {
id: string,
}
}
您遇到的问题是,流不知道
SuccessResponse
是否有额外的错误
参数
要告诉Flow它没有,您可以:
导出类型错误响应={|
错误:{
消息:string,
},
|}
导出类型成功响应={|
代币:{
id:string,
},
|}
您遇到的问题是,Flow不知道SuccessResponse
是否有额外的错误
参数
要告诉Flow它没有,您可以:
导出类型错误响应={|
错误:{
消息:string,
},
|}
导出类型成功响应={|
代币:{
id:string,
},
|}