@ivan0512

Почему тип never у пустого массива?

const test1 = []; // тут будет any[]
test1.push('');

const test2 = {
  field: [] // тут будет never[]
};
test2.field.push('') // соттветственно ошибка


Почему так происходит? Почему пустому массиву присваивается тип never, когда он внутри объекта?
Знаю, что можно пофиксить ошибку, если явно задать тип, но хочется разобраться, если ли в этом какой-то смысл или это скорее баг тайпскрипта
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
Вот соответствующий баг. А вот объяснение почему это не баг.

В общем случае пустой массив имеет тип never[]. Но в простом случае TypeScript умеет выводить тип изначально пустого массива по последующим операциям над ним. Типа push.

Так что реально тип test1 из вашего примера станет string[], как только будет "зафиксирован". Например, возвращён из функции или назначен в другую переменную.

Так что следующий код будет работать:
function buildArray() {
  const test1 = []; // тут будет any[]
  test1.push('str');
  test1.push(1);
}
const array = buildArray(); // тип (string | number)[]

А вот такой - уже нет
const test1 = []; // тут будет any[]
test1.push('');
const test2 = test1;
test2.push(2); // Argument of type '2' is not assignable to parameter of type 'string'.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы