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