TypeScript如何推断数组文字的元素类型?

时间:2018-10-14 16:33:40

标签: arrays typescript type-inference literals

尤其是为什么要编译此代码(使用--noImplicitAny)

function x() {
    const c = [];
    c.push({});
    c.indexOf({});
    return c;
}

同时,这不是:

function x() {
    const c = [];
    c.indexOf({});
    c.push({});
    return c;
}

enter image description here

1 个答案:

答案 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,则确定类型,并且不会引发错误。