尤其是为什么要编译此代码(使用--noImplicitAny)
function x() {
const c = [];
c.push({});
c.indexOf({});
return c;
}
同时,这不是:
function x() {
const c = [];
c.indexOf({});
c.push({});
return c;
}
答案 0 :(得分:6)
这是预期的行为,请参见此GitHub issue。此处描述的功能与您的功能相似,问题是为什么打开noImplicitAny
时不会出现错误:
function foo() {
const x = []
x.push(3)
return x
}
推断数组的类型为“进化数组”类型。然后它在第一个
number
之后变成x.push
。 foo应该返回number []
。 如果在控制流可以确定x
的类型之前就已对其进行见证,则将产生错误。例如:
function foo() {
const x = []
x.push(3)
return x;
function f() {
x; // error, x is `any`.
}
}
因此,在您的情况下,indexOf
在确定类型并引发错误之前见证了数组的类型。如果在indexOf
之后调用push
,则确定类型,并且不会引发错误。