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

时间:2019-02-14 21:36:26

标签: javascript flowtype subtyping

考虑以下几行

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行的流量阻塞,错误:

  

由于数字[1]与数组元素中的布尔值[2]不兼容,因此无法将a分配给q

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


至于上述应用程序:在我的实际工作代码中,我有一个函数可以接受任何“简单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对象的子类型。

1 个答案:

答案 0 :(得分:0)

我认为可以找到有关$ReadOnlyArray的一些有用信息。问题(我认为)是Array是不变的,这意味着Array<number>不是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链接中显示再现吗?