Extended dot notation (pick notation) proposal

Isiah Meadows isiahmeadows at gmail.com
Wed Sep 28 22:43:11 UTC 2016


I'll note that the type checking part will eventually get fixed in
TypeScript, at least.

https://github.com/Microsoft/TypeScript/issues/1295

Oh, and I've already suggested another, more specific, `pick` syntax (that
operation is only a shorthand for `x => x.property`) ,but it ultimately got
rejected since no one could really agree to anything different other than
the current state was workable, but not optimal. You may appreciate reading
the entire conversation, as it's pretty informative and is related to this.

Here's the specific comment proposing that idea:
https://github.com/tc39/proposal-bind-operator/issues/24#issuecomment-141331472

Here's the issue where most the related discussion took place:
https://github.com/tc39/proposal-bind-operator/issues/26

On Tue, Sep 6, 2016, 13:07 Bob Myers <rtm at gol.com> wrote:

> Here is a little decision tree of the issues.
>
> [image: Inline image 1]
>
> On Tue, Sep 6, 2016 at 6:49 PM, Isiah Meadows <isiahmeadows at gmail.com>
> wrote:
>
>> > Isiah's workaround works but has the unfortunate side affect of copying
>> values / increasing reference counts to objects. I'd love to see a built in
>> solution.
>>
>> You'd have to do that anyways, even if it's entirely internal. How do you
>> think you would do it outside of copying the values?
>>
>> On Mon, Sep 5, 2016, 19:45 Kris Siegel <krissiegel at gmail.com> wrote:
>>
>>> Hmm I gotta say I must have re-read that minimally extended dot notation
>>> proposal a few times and I just find the syntax confusing. I do like the
>>> idea of building a way of taking a portion of an object out of one object
>>> and into another but I don't think we need to provide additional syntax
>>> rules to handle this. Why couldn't this be an Object.pick() addition where
>>> it works similar to the underscore implementation? It could even be
>>> expanded to handle deep nesting (I'm actually adding this to my msngr.js
>>> library in the next release as grabbing a subset of an object is crazy
>>> useful and I need to do it far too frequently).
>>>
>>> Isiah's workaround works but has the unfortunate side affect of copying
>>> values / increasing reference counts to objects. I'd love to see a built in
>>> solution.
>>>
>>> On Mon, Sep 5, 2016 at 2:38 PM, Isiah Meadows <isiahmeadows at gmail.com>
>>> wrote:
>>>
>>>> TypeScript has a fair number of proposals aiming to address this
>>>> (things like difference types, partial types, etc.), but in general, I find
>>>> it just as easy to do it this way (which is easily checked):
>>>>
>>>> ```js
>>>> const {toDate, fromDate, location, flavor} = this.state;
>>>> const goodKeys = {toDate, fromDate, location, flavor};
>>>> ```
>>>>
>>>> On Fri, Sep 2, 2016, 16:08 Bob Myers <rtm at gol.com> wrote:
>>>>
>>>>> Here's another StackOverflow question
>>>>> <http://stackoverflow.com/questions/39299046/destructuring-a-subset-of-an-object-directly-into-a-new-object>
>>>>> essentially asking for pick notation. This same question pops up regularly.
>>>>> It's the real world talking to us telling us what they need. In this
>>>>> particular case, the solution with extended dot notation would just be
>>>>>
>>>>> ```
>>>>> var goodKeys = this.state.{toDate, fromDate, location, flavor};
>>>>> ```
>>>>>
>>>>> Perhaps I have not posted the minimal version of my proposal for this
>>>>> pick notation
>>>>> <https://github.com/rtm/js-pick-notation/blob/master/minimal/spec.md>,
>>>>> also known as extended dot notation.
>>>>> This version sacrifices some features in favor of complete
>>>>> compatibility with existing destructuring syntax following the dot.
>>>>>
>>>>> There is another good reason these days for thinking about something
>>>>> about this: *the advent of typed dialects of JS*.
>>>>> We already know that a simple lodash-type version of pick, such as
>>>>>
>>>>> ```
>>>>> function pick(o, keys) {
>>>>>   return Object.assign({}, ...keys.map(key => ({[key]: o[key]})));
>>>>> }
>>>>>
>>>>> const o = {a:1, b: 2};
>>>>> const o2 = pick(o, ['a']);
>>>>> ```
>>>>>
>>>>> cannot handle renaming or defaults or deep picking, but in addition *it
>>>>> cannot also not be typed properly*.
>>>>> For instance, `lodash.d.ts` defines `pick` as:
>>>>>
>>>>> ```
>>>>> pick<TResult extends {}, T extends {}>(
>>>>>   object: T,
>>>>>   ...predicate: (StringRepresentable|StringRepresentable[])[]
>>>>> ): TResult;
>>>>> ```
>>>>>
>>>>> with no type safety whatsoever.
>>>>>
>>>>> In contrast, with pick notation
>>>>>
>>>>> ```
>>>>> const o2 = o.{a};
>>>>> ```
>>>>>
>>>>> `o2` can be precisely typed by the compiler as an object containing
>>>>> the property `a`, or a type compatible or assignable to that type.
>>>>>
>>>>> --
>>>>> Bob
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> 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/20160928/715d5453/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: image.png
Type: image/png
Size: 51547 bytes
Desc: not available
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20160928/715d5453/attachment.png>


More information about the es-discuss mailing list