javascript - 流类型,转换为数组类型不适用于显式类型,但适用于隐式类型
问题描述
考虑以下几行
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 行(b
和r
),但是在第 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 对象的子类型。
解决方案
我认为可以找到一些有用的信息$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 链接或其他内容中显示重现吗?