Как отменить перенос нового значения в существующий массив с помощью оператора spread?

#javascript #typescript #ecmascript-6

#javascript #typescript #ecmascript-6

Вопрос:

Я пытаюсь unshift преобразовать значение массива в существующий массив, используя подход оператора распространения. получаю ошибку. кто-нибудь поможет мне найти правильный подход?

вот мой код :

 uploadedFiles : [...state.uploadedFiles.unshift( (<fileActions.UploadFileSuccess>action).payload ) ]
  

получение ошибки в виде :

 The Number is not array type
  

Заранее спасибо.

Комментарии:

1. Два кратких замечания: 1. Я собираюсь угадать по имени, которое state является объектом состояния реакции. Если это так, вы никогда не должны изменять его напрямую (что unshift и происходит). 2. ... не является оператором. 🙂

Ответ №1:

unshift изменяет массив и возвращает новую длину массива, которая является числом и которая не может быть расширена. Ваш код сводится к:

  [...state.uploadFiles.length]
  

Теперь, чтобы сделать это неизменяемым и правильным способом, не используйте отмену сдвига, просто добавьте элемент в массив перед распространением предыдущей версии:

  [action.payload, ....state.uploadFiles]
  

Комментарии:

1. попытка, которую я предпринял, чтобы добавить новый объект в качестве первого члена массива. как и в вашем предложении, он помещает новый элемент в качестве последнего…

2. @user2024080 — Нет, приведенное выше определенно делает action.payload первую запись в результирующем массиве.

Ответ №2:

Array#unshift возвращает новую длину массива.

Вам нужно просто взять элемент без распространения.

 uploadedFiles: [(<fileActions.UploadFileSuccess>action).payload, ...state.uploadedFiles]
  

Если вы хотите обновить, state.uploadedFiles вы могли бы unshift заранее.

 state.uploadedFiles.unshift((<fileActions.UploadFileSuccess>action).payload);

uploadedFiles: [...state.uploadedFiles]