Как TypeScript выводит тип элемента для литералов массива? - PullRequest
0 голосов
/ 14 октября 2018

В частности, почему этот код компилируется (с --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 голосов
/ 14 октября 2018

Это ожидаемое поведение, см. Эту проблему GitHub .Описанная здесь функция похожа на вашу, вопрос в том, почему не возникает ошибка при включенном 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, тип определяется и ошибки не возникает.

...