[Proposal] Optional spreading

Cyril Auburtin cyril.auburtin at gmail.com
Fri Aug 23 07:11:27 UTC 2019


Like others said, this idea is good, but I think we can already achieve
something decent and succinct enough

arrays:
```js
// group by name, and accumulate data:
arr.reduce((m, {name, data, ...o}) => m.set(name, {...o, data:
[...m.get(name)?..data||[], ...data]}), new Map())
```
objects: `{foo: 1, ...cond && {bar: 2}, qux: 3}`
https://gist.github.com/caub/7494b4391c2d62c49b565d2cfc2c0c1f#file-fetch-wrapper-js-L11


On Fri, Aug 23, 2019 at 5:01 AM Beknar Askarov <beknaraskarov at gmail.com>
wrote:

> And it does result in empty array
>
> [...''] -> []
>
> So not much difference even if it passes through. Everything else would
> result in error if check was only nullish
>
> On Fri, 23 Aug 2019, 04:55 Beknar Askarov, <beknaraskarov at gmail.com>
> wrote:
>
>> @Scott My mistake empty string [...""] is spreadable.
>> But not sure if it is desirable behavior.
>>
>>
>> On Fri, 23 Aug 2019, 04:42 Beknar Askarov, <beknaraskarov at gmail.com>
>> wrote:
>>
>>> Indeed. I see your point.
>>>
>>> But it really needs to be falsy check.
>>> Since falsy values are not "spreadable"
>>>
>>>
>>>
>>> On Fri, 23 Aug 2019, 03:52 Scott Rudiger, <scottrudiger at gmail.com>
>>> wrote:
>>>
>>>> I like it; code seems cleaner to me with its use. However, since the
>>>> syntax is so similar to optional chaining, it's too bad your goal with this
>>>> sample is to check for falsey values rather than nullish values.
>>>>
>>>> [ 1, ?...(condition && [2, 3]), // no extras:) 3, ]
>>>>
>>>> On Thu, Aug 22, 2019, 6:01 PM Beknar Askarov <beknaraskarov at gmail.com>
>>>> wrote:
>>>>
>>>>> Problem
>>>>>
>>>>> Spreading is great! It contributes towards "declerativity" of the
>>>>> language and reduces verbosity. I see one more feature to add to improve it.
>>>>>
>>>>> Consider following
>>>>>
>>>>> [
>>>>>   1,
>>>>>   condition && 2,
>>>>>   condition && 3,
>>>>>   4,
>>>>> ].filter(Boolean) // filtering needed to remove falsy values
>>>>> // Results in
>>>>> [1, 2, 3, 4] // if condition is `truthy`// and
>>>>> [1, 4] // if not truthy.
>>>>>
>>>>> Another way to achieve the same result without the need of filtering
>>>>> after
>>>>>
>>>>> [
>>>>>   1,
>>>>>    ...(condition ? [2, 3] : []), // note extra [] in the end, to avoid errors
>>>>>   4,
>>>>> ]
>>>>>
>>>>> Similar pattern with objects
>>>>>
>>>>> {
>>>>>   ...(condition ? { foo: 'bar' } : {}), // extra {}
>>>>> }
>>>>>
>>>>> Another pattern is when condition is the object itself, when it is
>>>>> known that type is one or falsy
>>>>>
>>>>> [
>>>>>   item1,
>>>>>   item2,
>>>>>   ...(itemsOrNull || []) // extra []
>>>>> ]
>>>>>
>>>>> Similar for objects
>>>>>
>>>>> {
>>>>>   ...(obj || {}), // extra {}
>>>>> }
>>>>>
>>>>> I see these patterns appearing very often. And these are cleanest
>>>>> examples I have seen so far.
>>>>> ProposalOptional spreadingWith condition
>>>>>
>>>>> // Arrays
>>>>> [
>>>>>   1,
>>>>>   ?...(condition && [2, 3]), // no extras:)
>>>>>   3,
>>>>> ]// Objects
>>>>> {
>>>>>   ?...(condition && { foo: 'bar' }) // no extras:)
>>>>> }
>>>>>
>>>>> When condition is the object
>>>>>
>>>>> [
>>>>>   item1,
>>>>>   item2,
>>>>>   ?...itemsOrNull // no extras at all:) even (...)
>>>>> ]
>>>>>
>>>>> These look nicer and can be good for performance since (?...), since
>>>>> no cleanup is needed after to remove falsy values or extra spreading even
>>>>> when it is not needed.
>>>>>
>>>>> Looks intuitive (since:
>>>>> https://github.com/tc39/proposal-optional-chaining)
>>>>> Plays nice with typeings.
>>>>>
>>>>> What do you think? https://es.discourse.group/t/optional-spreading/93
>>>>>
>>>>> _______________________________________________
>>>>> es-discuss mailing list
>>>>> es-discuss at mozilla.org
>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>
>>>> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190823/f79de205/attachment-0001.html>


More information about the es-discuss mailing list