Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.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 流类型细化不';如果通过另一个变量检查null/undefined,则不工作_Javascript_Flowtype - Fatal编程技术网

Javascript 流类型细化不';如果通过另一个变量检查null/undefined,则不工作

Javascript 流类型细化不';如果通过另一个变量检查null/undefined,则不工作,javascript,flowtype,Javascript,Flowtype,在下面的示例(或on)中,当我们通过另一个变量检查null/undefined时,类型细化似乎不起作用 type Position = {| x: number, y: number |} function anotherCondition(): bool{ return true; } function getIt(): ?Position{ return {x:7, y: 8} } function setIt(p:Position){ } const pos = g

在下面的示例(或on)中,当我们通过另一个变量检查null/undefined时,类型细化似乎不起作用

type Position = {|
  x: number,
  y: number
|}

function anotherCondition(): bool{
  return true;
}

function getIt(): ?Position{
  return {x:7, y: 8}
}

function setIt(p:Position){
}

const pos = getIt();
const isOk = pos && anotherCondition();
isOk && setIt(pos)

但是,如果我们在没有
isOk
变量的情况下进行内联操作,它就可以正常工作。但是我有几个地方可以检查这个条件,并且使用像
isOk
这样的变量可以让它不那么冗长。有什么办法使它起作用吗?或者我在这里遗漏了什么?

问题是您的
getIt
函数返回一个可选的
位置
,这意味着
flow
不知道
pos
是否有值

在您给出的示例中,
getIt
应该返回一个固定的
位置
类似(请参阅):

函数getIt():位置{ 返回{ x:7, y:8, } } 由于您100%确定
pos
类型为
Position
(因为
isOk
只能是
true
,如果是这样的话),您可以显式地将其键入
Position
(我知道这是一种肮脏的方式),如(请参阅):

isOk&&setIt((位置:任意):位置));

问题在于,您的
getIt
函数返回一个可选的
位置
,这意味着
不知道
pos
是否有值

在您给出的示例中,
getIt
应该返回一个固定的
位置
类似(请参阅):

函数getIt():位置{ 返回{ x:7, y:8, } } 由于您100%确定
pos
类型为
Position
(因为
isOk
只能是
true
,如果是这样的话),您可以显式地将其键入
Position
(我知道这是一种肮脏的方式),如(请参阅):

isOk&&setIt((位置:任意):位置));

您不应该依赖于显然经常无效的优化,而应该定义一个反映这两种情况的联合类型:

// @flow

type Position = {|
  x: number,
  y: number
|} | null

function anotherCondition(): bool{
  return true;
}

function getIt(): Position {
  const r = Math.random();
  return r <= 0.5 ? {x:7, y: 8} : null;
}

function setIt(p:Position){
  if (p) {}
  else {}
}

const pos = getIt();
setIt(pos);
/@flow
类型位置={|
x:号码,,
y:号码
|}|空
函数另一个条件():bool{
返回true;
}
函数getIt():位置{
常数r=数学随机();

return r您不应该依赖于显然经常无效的优化,而应该定义一个反映这两种情况的联合类型:

// @flow

type Position = {|
  x: number,
  y: number
|} | null

function anotherCondition(): bool{
  return true;
}

function getIt(): Position {
  const r = Math.random();
  return r <= 0.5 ? {x:7, y: 8} : null;
}

function setIt(p:Position){
  if (p) {}
  else {}
}

const pos = getIt();
setIt(pos);
/@flow
类型位置={|
x:号码,,
y:号码
|}|空
函数另一个条件():bool{
返回true;
}
函数getIt():位置{
常数r=数学随机();

return r我希望它是可选的。这只是一个例子。在实际场景中,
getIt
可能也会返回null。我为我的答案添加了一个替代选项。问题是,正如OP的示例所示,流的细化算法通常很难预测。@ftor确实如此。我有一大堆肮脏的typeca我自己,只是因为
flow
没有认识到所有的事情都是正确的。我想有时候应该解决这个问题,但现在,我担心的唯一选择是坚持使用脏字体。@TharakaWijebandara也许你可以在repo上报告这个问题(并在这里发布链接),这样就可以开始解决这个问题,人们可以添加
flow
团队可以用来解决这个问题的其他示例?我希望它是可选的。这只是一个示例。在实际场景中,在某些情况下,
getIt
也可能返回null。我已经添加了一个替代选项,您可以对我的答案执行此操作。问题在于flow的定义t算法通常很难预测,如OP的例子所示。@F事实上。我自己也有过一大堆肮脏的类型转换,只是因为
flow
没有识别出所有的东西都是正确的。我想有时候应该解决这个问题,但现在,坚持肮脏的类型转换是我唯一担心的选择。@TharakaWijebandara也许你是c将此作为一个问题报告在回购协议上(并在此处发布链接),这样就可以开始解决此问题,并且人们可以添加
flow
团队可以用来解决此问题的其他示例?