当前位置: 代码迷 >> JavaScript >> 流类型,强制转换为数组类型不适用于显式类型,但适用于隐式类型
  详细解决方案

流类型,强制转换为数组类型不适用于显式类型,但适用于隐式类型

热度:37   发布时间:2023-06-13 12:41:07.0

考虑以下几行

const a: Array<number> = [1,2,3];
const b = [1,2,3];
const q: Array<boolean | number> = a;
const r: Array<boolean | number> = b;

上面的代码适用于第2和第4行( br ),但是第3行上的流量扼流圈出现错误:

无法将a分配给q因为数字[1]与数组元素中的布尔[2]不兼容。

这对我来说意义不大,尤其是因为下面的行确实有效。 为什么这不起作用,如何使它起作用?


至于上述应用程序:在我的实际工作代码中,我有一个函数可以接受任何“简单javascript对象”(没有函数的对象)。 我所描述的:

 type primitive = boolean | number | string | void; type plain_js_object = { [string]: (primitive | Array<primitive> | plain_js_object) } function theFunction(input: plain_js_object) { //do_things return JSON.stringify(input); } 

然后,我还有其他一些函数返回整数数组,该函数的调用方式如下:

 const fib = [1, 1, 2, 3, 5]; theFunction({sequence: fib}); 

显然{sequence: fib}{sequence: Array<number>}类型的,显然是普通javascript对象的子类型。

我认为可以找到有关一些有用信息。 问题(我认为)是Array是不变的,这意味着Array<number>不是Array<number | boolean>的子类型。 Array<number | boolean> 这工作正常:

const a: Array<number> = [1,2,3];
const b = [1,2,3];
const q: $ReadOnlyArray<boolean | number> = a;
const r: Array<boolean | number> = b;

我最好的猜测是,当从数组文字而不是显式地键入类型时,Flow会做一些聪明的事情。

以您的示例为例,我在运行0.93时没有任何流错误,您可以在Flow Try链接中显示repro还是其他内容?

  相关解决方案