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
>>> 
>> 
>> 

Reply via email to