#javascript #typescript #destructuring
#javascript #typescript #разрушение
Вопрос:
В JavaScript /Typescript,
Какова короткая версия для разрушения и последующего присвоения новому объекту, например :
const payload: MyPayload = { a: 1, b: 2, c: 3, d: 4, e: 5 }
// Destruct
const { a, c, e } = payload;
// New Obj
const newPayload = {
a, c, e
};
Ответ №1:
Вы могли бы выполнить назначение деструктурирования с объектом и краткими свойствами для нового объекта.
const
getParts = ({ a, c, e }) => ({ a, c, e }),
payload = { a: 1, b: 2, c: 3, d: 4, e: 5 },
parts = getParts(payload);
console.log(parts);
Комментарии:
1. Я предполагаю, что это не будет компилироваться, если какой-либо из этих реквизитов является необязательным в
MyPayload
.
Ответ №2:
Вы можете использовать IIFE
const payload = { a: 1, b: 2, c: 3, d: 4, e: 5 }
const obj = (({a,c,e}) => ({a,c,e}))(payload)
console.log(obj)
Ответ №3:
Вы можете создать объект во время деструктурирования, используя object rest:
const payload = { a: 1, b: 2, c: 3, d: 4, e: 5 }
const { b, d, ...newPayload } = payload
console.log(newPayload)
Комментарии:
1. Это работает, только если вы знаете все ОСТАЛЬНЫЕ параметры. Не очень типичный вариант использования
2. На самом деле это стандартный вариант использования. Вы опускаете свойства для создания нового объекта, а иногда используете пропущенные свойства. Например, при разработке с React мы постоянно используем его для подготовки реквизита для дочерних элементов.
3. Это опасно в довольно большом количестве случаев. У вас нет защиты от добавления каких-либо других значений. Например. если вы фильтруете конфиденциальные поля из результата запроса к базе данных, прежде чем возвращать его в качестве http-ответа, все новые добавленные конфиденциальные поля останутся.