考虑以下几行
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行的流量阻塞,错误:
由于数字[1]与数组元素中的布尔值[2]不兼容,因此无法将
a
分配给q
。
这对我来说意义不大,尤其是因为下面的行确实有效。为什么这不起作用,我如何使其起作用?
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对象的子类型。
答案 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链接中显示再现吗?