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

iro*_*nic 2 arrays type-inference literals typescript

特别是,为什么这段代码编译(使用--noImplicitAny)

function x() {
    const c = [];
    c.push({});
    c.indexOf({});
    return c;
}
Run Code Online (Sandbox Code Playgroud)

虽然,这不是:

function x() {
    const c = [];
    c.indexOf({});
    c.push({});
    return c;
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

Tit*_*mir 6

这是预期的行为,请参阅此GitHub 问题.这里描述的功能类似于你的,问题是为什么启动时不会出现错误noImplicitAny:

function foo() {
  const x = []
  x.push(3)
  return x
}
Run Code Online (Sandbox Code Playgroud)

推断阵列的类型是"演化阵列"类型.它然后变成number第一个之后x.push.foo应该回来了number [].如果x在控制流可以确定其类型之前见证了类型,则会产生错误.例如:

function foo() {
  const x = []
  x.push(3)
  return x;

  function f() { 
    x; // error, x is `any`.
  }
}
Run Code Online (Sandbox Code Playgroud)

因此,在您的情况下,indexOf可以在确定类型并引发错误之前见证数组的类型.如果indexOfpush确定类型后调用,则不会引发错误.