首页 > 解决方案 > 流类型,转换为数组类型不适用于显式类型,但适用于隐式类型

问题描述

考虑以下几行

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 行出现阻塞,并出现错误:

无法分配给aq因为数字 [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 对象的子类型。

标签: javascriptflowtypesubtyping

解决方案


我认为可以找到一些有用的信息$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 链接或其他内容中显示重现吗?


推荐阅读