流类型,转换为数组类型不适用于显式类型,但适用于隐式类型
flow types, casting to array type doesn't work from explicit type, but does from implicit type
考虑以下几行
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 行出现流量阻塞,并出现错误:
Cannot assign a
to q
because number [1] is incompatible with boolean [2] in array element.
这对我来说意义不大,特别是因为下面的行确实有效。为什么这不起作用,我怎样才能让它起作用?
至于上面的应用:在我的实际工作代码中,我有一个函数可以接受任何 "simple javascript object" (没有函数的对象)。我描述的是:
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);
}
然后我有一些其他函数 returns 一个整数数组,然后调用该函数:
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,你能在流程尝试中展示一个重现 link 什么的吗?
考虑以下几行
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 行出现流量阻塞,并出现错误:
Cannot assign
a
toq
because number [1] is incompatible with boolean [2] in array element.
这对我来说意义不大,特别是因为下面的行确实有效。为什么这不起作用,我怎样才能让它起作用?
至于上面的应用:在我的实际工作代码中,我有一个函数可以接受任何 "simple javascript object" (没有函数的对象)。我描述的是:
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);
}
然后我有一些其他函数 returns 一个整数数组,然后调用该函数:
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,你能在流程尝试中展示一个重现 link 什么的吗?