Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/471.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 识别联合类型时出错(“在对象类型中找不到属性”)_Javascript_Flowtype - Fatal编程技术网

Javascript 识别联合类型时出错(“在对象类型中找不到属性”)

Javascript 识别联合类型时出错(“在对象类型中找不到属性”),javascript,flowtype,Javascript,Flowtype,我很难描述函数参数的类型,它要么是成功的,要么是错误的api响应。下面是这个问题的一个简单而令人困惑的例子(转载于TryFlow at) 函数可以接受成功响应对象或错误响应对象: export type ErrorResponse = { error: { message: string, } } export type SuccessResponse = { token: { id: string, } } 然后,它应该决定它是哪种响应,并将响应传递给handleSuc

我很难描述函数参数的类型,它要么是成功的,要么是错误的api响应。下面是这个问题的一个简单而令人困惑的例子(转载于TryFlow at)

函数可以接受成功响应对象或错误响应对象:

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,
},
|}