Just in case what I proposed in my previous email isn't quite clear, I
wrote a little code to clarify. Here's a AS3 type definition for
createjs.EventDispatcher that I created by hand:

package createjs
{
    public class EventDispatcher
    {
        native public function EventDispatcher();

        // static methods
        native public static function initialize(target:Object):void;

        // methods
        native public function addEventListener(type:String,
listener:Object, useCapture:Boolean = null):Object;
        native public function dispatchEvent(eventObj:Object, target:Object
= null):Boolean;
        native public function hasEventListener(type:String):Boolean;
        native public function off(type:String, listener:Object,
useCapture:Boolean = false):void;
        native public function on(type:String, listener:Object,
scope:Object = null, once:Boolean = false, data:Object = null,
useCapture:Boolean = null):Object;
        native public function removeAllEventListeners(type:String =
null):void;
        native public function removeEventListener(type:String, Object,
useCapture:Boolean = null):void;
        native public function willTrigger(type:String):Boolean;
    }
}

It's based on this TypeScript definition:

export class EventDispatcher {
    constructor();

    // methods
    addEventListener(type: string, listener: (eventObj: Object) => boolean,
useCapture?: boolean): Function;
    addEventListener(type: string, listener: (eventObj: Object) => void,
useCapture?: boolean): Function;
    addEventListener(type: string, listener: { handleEvent: (eventObj:
Object) => boolean; }, useCapture?: boolean): Object;
    addEventListener(type: string, listener: { handleEvent: (eventObj:
Object) => void; }, useCapture?: boolean): Object;
    dispatchEvent(eventObj: Object, target?: Object): boolean;
    dispatchEvent(eventObj: string, target?: Object): boolean;
    dispatchEvent(eventObj: Event, target?: Object): boolean;
    hasEventListener(type: string): boolean;
    static initialize(target: Object): void;
    off(type: string, listener: (eventObj: Object) => boolean, useCapture?:
boolean): void;
    off(type: string, listener: (eventObj: Object) => void, useCapture?:
boolean): void;
    off(type: string, listener: { handleEvent: (eventObj: Object) =>
boolean; }, useCapture?: boolean): void;
    off(type: string, listener: { handleEvent: (eventObj: Object) => void;
}, useCapture?: boolean): void;
    off(type: string, listener: Function, useCapture?: boolean): void; //
It is necessary for "arguments.callee"
    on(type: string, listener: (eventObj: Object) => boolean, scope?:
Object, once?: boolean, data?: any, useCapture?: boolean): Function;
    on(type: string, listener: (eventObj: Object) => void, scope?: Object,
once?: boolean, data?: any, useCapture?: boolean): Function;
    on(type: string, listener: { handleEvent: (eventObj: Object) =>
boolean; }, scope?: Object, once?: boolean, data?: any, useCapture?:
boolean): Object;
    on(type: string, listener: { handleEvent: (eventObj: Object) => void;
}, scope?: Object, once?: boolean, data?: any, useCapture?: boolean):
Object;
    removeAllEventListeners(type?: string): void;
    removeEventListener(type: string, listener: (eventObj: Object) =>
boolean, useCapture?: boolean): void;
    removeEventListener(type: string, listener: (eventObj: Object) => void,
useCapture?: boolean): void;
    removeEventListener(type: string, listener: { handleEvent: (eventObj:
Object) => boolean; }, useCapture?: boolean): void;
    removeEventListener(type: string, listener: { handleEvent: (eventObj:
Object) => void; }, useCapture?: boolean): void;
    removeEventListener(type: string, listener: Function, useCapture?:
boolean): void; // It is necessary for "arguments.callee"
    toString(): string;
    willTrigger(type: string): boolean;
}

The AS3 version gives me proper code hinting in Flash Builder, which is
pretty sweet.

- Josh

On Mon, Jun 1, 2015 at 1:10 PM, Josh Tynjala <joshtynj...@gmail.com> wrote:

> Yeah, I think optional parameters can default to null pretty safely. I
> have some other ideas to make the conversion easier.
>
> I think we can use some simplified rules for overloads, at least to start
> out. If we want to do it like Randori, and create function signatures that
> map to a different name, that would be cool, but I don't think it's
> strictly necessary.
>
> 1) If the parameter names are the same, but the types are different, you
> can just type it as Object in AS3. People already do this in pure AS3 when
> multiple types are accepted.
>
> Here are the overloads from TypeScript's dispatchEvent() in the
> createjs.EventDispatcher class:
>
> dispatchEvent(eventObj: Object, target?: Object): boolean;
> dispatchEvent(eventObj: string, target?: Object): boolean;
> dispatchEvent(eventObj: Event, target?: Object): boolean;
>
> In AS3, these could map to a function like this:
>
> native public function dispatchEvent(eventObj:Object, target:Object =
> null):Boolean;
>
> 2) If the parameter names vary too much, then using ...rest should be an
> acceptable fallback. There is precedence in AS3 with this one too. The
> sort() function in the Array class has a signature with ...rest because the
> arguments are very flexible:
>
> http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sort%28%29
>
> Here's example where this might apply to converting TypeScript definitions
> to AS3 definitions. JQuery has a static extend() function with these
> overloads:
>
> extend(target: any, object1?: any, ...objectN: any[]): any;
> extend(deep: boolean, target: any, object1?: any, ...objectN: any[]): any;
>
> AS3 doesn't really have a mechanism to handle an extra argument at the
> beginning, so it should fall back to ...rest, like this:
>
> native public static function extend(...rest:Array):Object;
>
> Not ideal, but I think it's a good start that can be easily expanded in
> the future with something like what Randori offered.
>
> - Josh
>
>
> On Mon, Jun 1, 2015 at 7:29 AM, Harbs <harbs.li...@gmail.com> wrote:
>
>> Okay. The obvious difference is that subclasses might not implement the
>> variable, but adding "foo=null” to the signature doesn’t sound like an
>> insurmountable task…
>>
>> On Jun 1, 2015, at 5:10 PM, Harbs <harbs.li...@gmail.com> wrote:
>>
>> > How is that different than adding “=null” to the signature?
>> >
>> > On Jun 1, 2015, at 4:56 PM, Michael Schmalle <teotigraphix...@gmail.com>
>> wrote:
>> >
>> >> "The main problems were method overloading and optional members. An
>> >> interface in TS doesn't necesarilly HAVE to be implement completely
>> >> by a class, by adding a question mark to the declaration you make that
>> >> member optional."
>> >
>>
>>
>

Reply via email to