流类型,转换为数组类型不是从显式类型工作,而是从隐式类型

问题描述 投票:0回答:1

考虑以下几行

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,因为number [1]与数组元素中的boolean [2]不兼容。

这对我来说没什么意义,特别是因为下面的行确实有效。为什么这不起作用,我怎样才能使它工作?


As for an application of above: in my real working code I have a function that accepts any "simple javascript object" (an object without functions). Which I described by:
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对象的子类型。

javascript flowtype subtyping
1个回答
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链接中显示一个repro吗?

© www.soinside.com 2019 - 2024. All rights reserved.