facebook / flow

Adds static typing to JavaScript to improve developer productivity and code quality.
https://flow.org/
MIT License
22.09k stars 1.86k forks source link

ES2015 & 2016 Features meta-issue #560

Closed samwgoldman closed 3 years ago

samwgoldman commented 9 years ago

Feel free to open an issue for any unchecked feature that doesn't already have one, but please try to keep discussion in a single issue if possible. Use cases (and test cases) are very welcome!

To report a bug with a completed feature, please open a new issue for the bug.

ES2015+

Proposals

Stage 4

Stage 3

mroch commented 9 years ago

this is super useful!

there are probably a bunch of new APIs that we need to add, too. for example, I just noticed that we don't have String.prototype.codePointAt (part of new unicode stuff)

nmn commented 9 years ago

Perhaps, add an ES7 section and mark async-await as done.

(BTW, I find it surprising that async-await is done before generators!)

Globegitter commented 9 years ago

It seems there is an issue with ES6 Class support. I am using atom/nuclide IDE and having the following code:

export default class Resource {
  constructor(req:string) {
    this.req = req * 2;
  }
}

assignment of property req Property req not found in Resource even though I am defining it here in the constructor.

gabelevi commented 9 years ago

@Globegitter, Flow wants you to declare class properties like so:

export default class Resource {
  req: number;
  constructor(req: number) {
    this.req = req * 2;
  }
}

Why do we require this? Well, if we don't make people declare properties then we can't detect things like

function getReq(resource: Resource): number {
  return resource.rep;
}

We do realize this is a little bit more work for the developer, but we're hoping the benefits outweigh the pain.

Globegitter commented 9 years ago

Aahh, I see, thanks @gabelevi For know I mostly want to use flow for its type inference with /* @flow weak */. The issue here is that I can not just put req; res; at the top, it does throw an 'Unexpected token;` issue.

Generally I do think this is an acceptable extra-effort, but why can flow not just get the information from the constructor itself? Is it that much more complex to see what this.req is assigned to and then look up the type in the constructor's parameter list?

As a side note kind of fitting to this, it would be great to see property initialiser support as mentioned here: http://babeljs.io/blog/2015/06/07/react-on-es6-plus/

gabelevi commented 9 years ago

I think at the moment that Flow requires type annotations for the class member properties you declare. So

req: any; res: any;

should work. I did recently change the parsing of that (https://github.com/facebook/flow/commit/7e5b2a9a4bed89d97b5961b27d92a405f98f7b65) in preparation for class property initializers. We absolutely are planning support for class property initializers. They solve so many problems! The one I hate the most is how you have to do

class Foo {
  constructor() {
    this.myCallBack = this.myCallBack.bind(this);
  }
  myCallBack() { ... }
}

but with class property initializers you can do

class Foo {
  myCallBack = () => { ... }
}
Globegitter commented 9 years ago

Thanks for the quick response that all sounds good :) And yep it really does solve a lot of issues.

samwgoldman commented 9 years ago

Generally I do think this is an acceptable extra-effort, but why can flow not just get the information from the constructor itself? Is it that much more complex to see what this.req is assigned to and then look up the type in the constructor's parameter list?

@Globegitter, good insight! Actually, flow used to do this, but the functionality was removed. I'm not sure about the details surrounding this, but there is some explanation in a comment in the source code.

Unfortunately, this change was from the days of "sync to upstream" so the diff is big and it's hard to see the implications in terms of the code changes themselves.

oztune commented 9 years ago

image

^ What happened with let support?

I think it'd help if this was taken care of if only because at a glance it makes the whole project seem to be behind. For example it's being used as a con on this list, which happens to be a top result for googling "flow vs TypeScript"

image http://www.reddit.com/r/javascript/comments/39cere/typescript_vs_flow_results_from_our_investigation/

Also in this comment: image http://www.reddit.com/r/javascript/comments/39cere/typescript_vs_flow_results_from_our_investigation/ct6xagb

Flow looks really promising, keep up the great work!

samwgoldman commented 9 years ago

What happened with let support?

We're actively working on it. Please be patient.

nmn commented 9 years ago

@oztune by all means use my fork in the mean time: github.com/nmn/flow

gregwebs commented 9 years ago

classes are checked, but class property initializers are not supported: can we have a check box for that? Making it hard for me to swallow ES6 classes right now.

An alternative approach to much of this work is to leverage babel more

samwgoldman commented 9 years ago

@gregwebs class property initializers are not ES6/ES2015, but it's definitely on our radar. I think, instead of creating a separate meta issue for ES2016 features, we should just track that here. I'll make the necessary changes.

gregwebs commented 9 years ago

Ah, in that case I will take any hack I can get. Seems to work to put this in the constructor:

      // fix broken es6 classes
      _.each(Object.getOwnPropertyNames( Object.getPrototypeOf(this) ), prop => {
        this[prop] = this[prop].bind(this)
      })
Gozala commented 9 years ago

@samwgoldman I think it would make sense to update #431 to #784 given that's where the ongoing work is now.

samwgoldman commented 9 years ago

@Gozala You're right! Thanks & done.

cesarandreu commented 9 years ago

I'd vote for adding export extensions to the ES2016 list. (Not sure if they're supported?)

samwgoldman commented 9 years ago

Is there an maintained list of the various proposals, along with the stage? Official would be ideal, but anything would help.

cesarandreu commented 9 years ago

@samwgoldman there's a list of the ones that are available in babel.

BenoitZugmeyer commented 9 years ago

@samwgoldman Here is the official list: https://github.com/tc39/ecma262

jwangnz commented 9 years ago

@samwgoldman I thinks the Reflect should be added to the list of ES2015

Gozala commented 9 years ago

I think #810 should be on the list as well

bolinfest commented 9 years ago

@samwgoldman I just filed https://github.com/facebook/flow/issues/850 for ES7 property initializers, so could you please update this issue with that?

RavenHursT commented 9 years ago

What about ES6 Getters and Setters? Currently Flow doesn't support the syntax, correct?

http://javascriptplayground.com/blog/2013/12/es5-getters-setters/

hzoo commented 9 years ago

@RavenHursT you can add unsafe.enable_getters_and_setters=true under [options] in your flowconfig

RavenHursT commented 9 years ago

@hzoo so looks like back in 0.14 they added what you're suggesting.. what does the unsafe denote? Is this something we can use now in 0.16 and it'll work?

https://github.com/facebook/flow/releases/tag/v0.14.0

samwgoldman commented 9 years ago

@RavenHursT It's unsafe because a setter/getter might have a side-effect that causes a program to have a runtime error, but Flow won't catch it.

RavenHursT commented 9 years ago

@samwgoldman Got it. Thanks! :+1:

jwangnz commented 9 years ago

@samwgoldman Could you add ES7 function bind syntax to the list ? It is useful when use React ES6 classes

https://github.com/zenparsing/es-function-bind

samwgoldman commented 9 years ago

@tsing I'm not sure we should even track stage 0 (strawman) proposals. I'd like to see that proposal make a bit more standardization progress first.

jonvuri commented 8 years ago

Is there already an issue for documentation somewhere? I don't know if it's supposed to be yet, but how to annotate arrow functions doesn't seem to be documented in http://flowtype.org/docs/functions.html.

marudor commented 8 years ago

List is outdated: Class Decorator are fixed with https://github.com/facebook/flow/pull/1638 Regexp u and y flags with https://github.com/facebook/flow/pull/1177

willclarktech commented 8 years ago

+1 for function bind operator

anaibol commented 8 years ago

+1!

rosskevin commented 8 years ago

ES2015/2016 classes without semicolons break the parser and provide incorrect errors. See #1908 with test repo included.

rpominov commented 8 years ago

Couldn't find class literal properties in the list. For example:

class Id<T> {
  _x: T;
  constructor(x: T) {
    this._x = x
  }
  static 'fantasy-land/of'<T>(x: T): Id<T> {
    return new Id(x)
  }
}

Flow yields:

static 'fantasy-land/of'<T>(x: T): Id<T> {
       ^ literal properties not yet supported

Is this on agenda? We need this for Fantasy Land.

yamafaktory commented 7 years ago

Hi,

The class decorators feature is marked as checked but currently, those decorators are still not present in the AST (https://github.com/facebook/flow/pull/1638 & https://github.com/facebook/flow/issues/2741).

And thanks a lot for your great work 👍.

DimitryDushkin commented 7 years ago
export default from './some-component';

throws "Unexpected string" error.

Issue is resolved via some "hack":

export { default } from './some-component';
Jessidhia commented 7 years ago

That is not some hack, that is the correct syntax (reexport the "default" export as an export named "default"). export default from is not valid syntax, but maybe the error message could be better.

Pauan commented 7 years ago

There is a proposal to add in this feature: [link]

And a related proposal: [link]

DimitryDushkin commented 7 years ago

Thank you. I thought it's already in specification, because webpack 2 understands export default from ....

langri-sha commented 7 years ago

do expressions are now stage 0. Here's is the list of active ECMAScript proposals for the curious.

lyleunderwood commented 6 years ago

do expressions are now stage 1.

leoselig commented 6 years ago

@samwgoldman I believe this

  • [ ] Default parameters (mostly supported, except using this: #1234)

is already done as of d3887c226901cee0fad4d6058651c74e46bc3c14.

Is this list still maintained?

grundiss commented 6 years ago

Still no support for do-expressions? :C

PinkaminaDianePie commented 6 years ago

Any news about do-expressions? They are extremely useful for FP-style, but I can't use flow together with them.

verekia commented 6 years ago

Throw expressions: https://github.com/facebook/flow/issues/6605

bradennapier commented 6 years ago

do expressions ftw!

bradennapier commented 5 years ago

Came here to say "do expressions ftw!" but I see I already did this in July :-\ heh

Xunnamius commented 5 years ago

Not seeing flow errors for throw expressions would be incredibly nice!