Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Disallow { a } #325

Open
Jack-Works opened this issue Apr 12, 2024 · 9 comments
Open

Disallow { a } #325

Jack-Works opened this issue Apr 12, 2024 · 9 comments

Comments

@Jack-Works
Copy link
Member

Current spec does not allow { ...a }.

You have to write { ...let a } (bind rest to a) or { ...(a) } (test rest with a, where a might be a custom matcher) depends on your intension.

I think we should also do this to { a, b: 1 } to disambiguate { a: a, b: 1 } (match with a) with { b: 1} and has "a" (has a property in it).

Currently, { a } means and has "a".

Or we can do the other way, allowing { ...a } to be { ...(a) }.

@tabatkins
Copy link
Collaborator

You have to write ... { ...(a) }

That shouldn't be required. {...a} is perfectly fine - it makes an object holding the remaining properties, then tests it against the a pattern. Where are you seeing the restriction that requires parentheses?

@Jack-Works
Copy link
Member Author

@tabatkins it's in the spec as a not-consensused-yet feature. I identified them as footguns and therefore included them in the spec. { ...a } in a pattern has slightly different meaning with in the destructing, therefore it's better to ban it and require explicit clarify of what developer means (a) or let a

img

@ljharb
Copy link
Member

ljharb commented Apr 13, 2024

I'm confused, what else would { ...a } mean other than { ...a: a }?

@Jack-Works
Copy link
Member Author

I'm confused, what else would { ...a } mean other than { ...a: a }?

It means collecting rest properties in the destructing and binding it to a variable out of pattern matching. Developers might think it has the same meaning inside pattern matching.

const { x, ...rest } = obj
if (obj2 is { y, ...rest2 }) {
    // ?? y and rest2 are not bindings!!
}

@ljharb
Copy link
Member

ljharb commented Apr 14, 2024

How is that different from any other object destructuring pattern?

@Jack-Works
Copy link
Member Author

In my example, x and rest is a binding, but y and rest2 is not.

@ljharb
Copy link
Member

ljharb commented Apr 14, 2024

Yes, I agree this is a difference between destructuring and pattern matching - it has nothing to do with rest properties or with the concise form, though.

If we don't want that discrepancy, we'd need to revert to our previous version that had ${} and implicit bindings, which already got pushback.

@tabatkins
Copy link
Collaborator

Yeah, {...a} is as different between pattern-matching and destructuring as {a} is. Both are consistent with their own rules, where the ident in ...foo is interpreted the same as the value in {key: foo} - in pattern-matching it's a pattern in both places, and in destructuring it's a name binding in both places.

It would be fairly bad to change this, imo.

@55Cancri

This comment was marked as off-topic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants