It's not optional on the base interface where addEventListener() and
removeEventListener() are defined. I think it's EventTarget. Since
subclasses and implementers of interfaces aren't allowed to change the
signature of a method in ActionScript, externc uses the original signature
and ignores the overload on FileReader.

I opened a pull request for Closure Compiler to make that parameter
optional on EventTarget in the official externs (it was non-optional
because some old browsers required it, I think). Google seemed open to the
idea, but I don't think they ever merged it.

- Josh

On Mar 18, 2017 12:12 PM, "Harbs" <harbs.li...@gmail.com> wrote:

> I found what looks like a bug in the FileReader typedefs:
>
> The following in fileapi.js:
>
> /**
>  * @param {boolean=} opt_useCapture
>  * @override
>  * @return {undefined}
>  */
> FileReader.prototype.addEventListener = function(type, listener,
> opt_useCapture)
>     {};
>
> /**
>  * @param {boolean=} opt_useCapture
>  * @override
>  * @return {undefined}
>  */
> FileReader.prototype.removeEventListener = function(type, listener,
>     opt_useCapture) {};
>
> compiles to this in FileReader.as:
>
>     /**
>      * @param opt_useCapture [(boolean|undefined)]
>      * @see [fileapi]
>      * @returns {undefined}
>      */
>     public function addEventListener(type:String, listener:Object,
> useCapture:Boolean):Object /* undefined */ {  return null; }
>
>     /**
>      * @param opt_useCapture [(boolean|undefined)]
>      * @see [fileapi]
>      * @returns {undefined}
>      */
>     public function removeEventListener(type:String, listener:Object,
> useCapture:Boolean):Object /* undefined */ {  return null; }
>
> The result is wrong because the third parameter is supposed to be
> optional. The thing is, I don’t understand how we ended up with the output
> we did. The parameter was renames and retyped…
>
> Harbs

Reply via email to