[Proposal] Optional spreading

Beknar Askarov beknaraskarov at gmail.com
Fri Aug 23 03:00:56 UTC 2019


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
>>>>
>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190823/0b4e2820/attachment-0001.html>


More information about the es-discuss mailing list