It seems to me that the extern is wrong. According to MDC, the return type for all Promise methods should be of type Promise.[1]
Maybe Promise should implement IThenable (and possibly ICatchable), but I think Promise should return Promise. How do we patch the js files? I could also try to make a pull request and/or open an issue on their extern. My last pull request for node externs was accepted. Thoughts? [1]https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then On Nov 17, 2016, at 12:42 AM, Josh Tynjala <joshtynj...@gmail.com> wrote: > Based on that really strange @template tag, Object is definitely the > correct response from externc. Google seems to be doing something advanced > there that I'm not even sure is documented. > > I also don't think we want to try to parse that mess. If we want it to > return IThenable or something, then we need to apply a patch file, similar > to other changes that we make. > > - Josh > > On Wed, Nov 16, 2016 at 2:26 PM, Harbs <harbs.li...@gmail.com> wrote: > >> >> On Nov 16, 2016, at 11:20 PM, Alex Harui <aha...@adobe.com> wrote: >> >>> >>> >>> On 11/16/16, 11:07 AM, "Harbs" <harbs.li...@gmail.com> wrote: >>> >>>> >>>> So you are suggesting to make it a top-level class. Right? Otherwise >>>> we’re not good to go. >>>> >>>> Another problem with the definition in js.swc is that then() returns an >>>> Object, while it should really return a Thenable. I don’t think Thenable >>>> is defined as an interface in JS. >>> >>> You can use patch files and missing.js to tweak the API if you need to. >> >> I’m a bit confused by where the types are being picked up from. js.swc >> definitely gets them, and it looks like it’s getting them from es6.js. I >> see that there actually is an IThenable which is a defined type, although >> IThenable only has a then() method and not a catch() method. >> >> One thing which is throwing me off is the fact that es6.as defines >> Promise.resolve() like this: >> /** >> * @param {VALUE=} opt_value >> * @return {RESULT} >> * @template VALUE >> * @template RESULT := type('Promise', >> * cond(isUnknown(VALUE), unknown(), >> * mapunion(VALUE, (V) => >> * cond(isTemplatized(V) && sub(rawTypeOf(V), 'IThenable'), >> * templateTypeOf(V, 0), >> * cond(sub(V, 'Thenable'), >> * unknown(), >> * V))))) >> * =: >> */ >> Promise.resolve = function(opt_value) {}; >> >> I have no clue what all this template stuff means, but the js.swc is >> expecting an Object as the return type. >> >> Promise.reject() has a return type of Promise which seems more correct to >> me. Is Promise.resolve() broken, and if yes, how do we fix it? >> >>> >>>> >>>>> IMO, polyfills should be beads you add to your Application beads if you >>>>> need them. >>>> >>>> Makes sense, although I’m not sure what the bead would look like. >>>> I think manually adding a polyfill for I.E. in the HTML is a reasonable >>>> work-around as well. >>> >>> The bead would use <inject_html> >>> >>> -Alex >>> >> >>