Javascript 流量不’;t让我通过'Array<;A>;`到`数组<;A | B>;`(子类型数组到超类型数组)

Javascript 流量不’;t让我通过'Array<;A>;`到`数组<;A | B>;`(子类型数组到超类型数组),javascript,arrays,flowtype,Javascript,Arrays,Flowtype,我有一个数组类型的值 类似地,我无法传递数组流引发错误,因为它认为可能会变异数组: //给出了问题第二个示例中的“节点”、“阳极”和“节点”的定义 函数getFirstNodeType(节点:数组):字符串{ 常量bNode:bNode={type:'b',count:0} //更改参数“nodes”。根据其类型添加“BNode”是有效的。 节点推送(bNode); 返回节点[0]。类型; } 常量节点子类型:数组 运行上述代码后,nodesSubtype将包含一个BNode,即使它被声明为一个

我有一个
数组类型的值


类似地,我无法传递
数组

流引发错误,因为它认为可能会变异数组

//给出了问题第二个示例中的“节点”、“阳极”和“节点”的定义
函数getFirstNodeType(节点:数组):字符串{
常量bNode:bNode={type:'b',count:0}
//更改参数“nodes”。根据其类型添加“BNode”是有效的。
节点推送(bNode);
返回节点[0]。类型;
}
常量节点子类型:数组

运行上述代码后,
nodesSubtype
将包含一个
BNode
,即使它被声明为一个
阳极的数组,违反了它的类型

有两种解决方案可以让Flow相信您不会改变数组。最清晰的方法是用流实用程序类型替换数组

函数getFirstNodeType(节点:$ReadOnlyArray):字符串{//使用$ReadOnlyArray
返回节点[0]。类型;
}
常量节点子类型:数组

您只需在函数参数的类型(例如,
节点
)中进行替换,但如果愿意,您可以在其适用的任何地方(例如,
节点子类型
)使用
$ReadOnlyArray

$ReadOnlyArray
是最安全的类型解决方案,但您可能不想更改所有现有函数来使用它。在这种情况下,您可以选择通过
any
强制转换数组类型。是的,你可以从一开始就这样做,但至少现在你知道为什么这样做是安全的。您甚至可以留下一条注释来解释此强制转换存在的原因,这可能有助于您捕获不再有效的假设

函数getFirstNodeType(节点:数组):字符串{ 返回节点[0]。类型; } 常量节点子类型:数组

如果您不关心记录问题,可以省略注释,只转换为
any

getFirstNodeType((nodesSubtype:any));

额外资源
  • $ReadOnlyArray
    于2018年8月成为,这要归功于
  • 前一篇文章介绍了第三种可能的解决方法,包括将函数的数组类型包装为泛型类型

这个问题与您的问题相同。我发布了这个问题,而不是在这个问题上添加一个新的答案,原因有二:为人们理解这个问题提供更好的、简化的例子,以及为人们搜索这个问题提供不同的关键字。这两个原因中的第一个可能表明,这个问题不应该重复。