TLDR
let userName1 = 'koko'
const user1 = {
id: 100500,
...(userName1 && {userName: userName1})
}
console.log(user1) // {id: 100500, userName 'koko'}
let userName2
const user2 = {
id: 100501,
...(userName2 && {userName: userName2})
}
console.log(user2) // {id: 100500}
Стала передо мной недавно задача создавать объекты для ORM. В виду типизированности (код тайпскриптовый), ограничений ORM (null
и undefined
интерпретируются не как отсутствие свойства) и разнородности данных (иногда свойства есть иногда их нет), стало нужным объявлять объекты с переменным набором свойств. При том свойство не должно быть объявлено при некоторых условиях. Можно, конечно, создавать свойства со значениями null
или undefined
, а потом их удалять отдельным шагом. Или добавлять свойства уже после объявления объекта императивно через условия. Но оказывается есть более-менее вариант: спред объекта.
Вся конструкция работает потому что при спреде falsy значений (null, undefined), в целевой объект не попадает никаких свойств.
Вот источник который дал мне эти знания: javascript - Typescript - Conditional property of object - Stack Overflow.