[Proposal] Optional spreading

Beknar Askarov beknaraskarov at gmail.com
Fri Aug 23 14:24:56 UTC 2019


@Scott Rudiger After thinking more about it.
I would not like to conflict with semantics of optional chaining and null
coalescing operator.
So in order to not confuse people, maybe introduce two types of optional
spread operators


1. `?...` - Do not spread if nullish. Note nullish. Else try to spread.
Signature Array: [?...(nullish | Iterable)];
Signature Object: {?...(nullish | object)};

2. `!...` - Do not spread if false. Note FALSE not falsy. Else try to
spread.
Signature Array: [!...(false | Iterable)];
Signature Object: {!...(false | object)};

I think this can be an option to avoid consfusion

Why not `!...` to check for all falsy and do not spread of falsy?
To avoid confusion and make developers to know their types

For example:

```js
[!...(0 ?? [1 , 2])]; // throws TypeError. number 0 is not iterable
```

So better will be to use:
```js
[!...(!!0 ?? [1 , 2])];
// OR
[?...(0 ?? [1 , 2])];
```

What do you think?

On Fri, Aug 23, 2019 at 5:00 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
>>>>>
>>>>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190823/b911010b/attachment-0001.html>


More information about the es-discuss mailing list