From 5d2d699e6bef9fcbce76fa02a8a2cb78a734a297 Mon Sep 17 00:00:00 2001 From: Luc Matagne Date: Tue, 17 Oct 2017 17:05:03 +0200 Subject: [PATCH] [SignalsJS] Add Generic type support (#20429) * [SignalsJS] Add Generic type support * Any as default Signal type * Add default any types for other declarations --- types/signals/index.d.ts | 24 ++++++++++++------------ types/signals/signals-tests.ts | 18 +++++++++--------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/types/signals/index.d.ts b/types/signals/index.d.ts index 879aa189f1..3f0ed1fa84 100644 --- a/types/signals/index.d.ts +++ b/types/signals/index.d.ts @@ -10,23 +10,23 @@ export as namespace signals; declare namespace signals { - interface SignalWrapper { - Signal: Signal + interface SignalWrapper { + Signal: Signal } - interface SignalBinding { + interface SignalBinding { active: boolean; context: any; params: any; detach(): Function; execute(paramsArr?: any[]): any; - getListener(): Function; - getSignal(): Signal; + getListener(): (...params: T[]) => void; + getSignal(): Signal; isBound(): boolean; isOnce(): boolean; } - interface Signal { + interface Signal { /** * Custom event broadcaster *
- inspired by Robert Penner's AS3 Signals. @@ -34,7 +34,7 @@ declare namespace signals { * @author Miller Medeiros * @constructor */ - new (): Signal; + new (): Signal; /** * If Signal is active and should broadcast events. @@ -59,7 +59,7 @@ declare namespace signals { * @param listenercontext Context on which listener will be executed (object that should represent the `this` variable inside listener function). * @param priority The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) */ - add(listener: Function, listenerContext?: any, priority?: Number): SignalBinding; + add(listener: (...params: T[]) => void, listenerContext?: any, priority?: Number): SignalBinding; /** * Add listener to the signal that should be removed after first execution (will be executed only once). @@ -68,14 +68,14 @@ declare namespace signals { * @param listenercontext Context on which listener will be executed (object that should represent the `this` variable inside listener function). * @param priority The priority level of the event listener. Listeners with higher priority will be executed before listeners with lower priority. Listeners with same priority level will be executed at the same order as they were added. (default = 0) */ - addOnce(listener: Function, listenerContext?: any, priority?: Number): SignalBinding; + addOnce(listener: (...params: T[]) => void, listenerContext?: any, priority?: Number): SignalBinding; /** * Dispatch/Broadcast Signal to all listeners added to the queue. * * @param params Parameters that should be passed to each handler. */ - dispatch(...params: any[]): void; + dispatch(...params: T[]): void; /** * Remove all bindings from signal and destroy any reference to external objects (destroy Signal object). @@ -100,12 +100,12 @@ declare namespace signals { /** * Check if listener was attached to Signal. */ - has(listener: Function, context?: any): boolean; + has(listener: (...params: T[]) => void, context?: any): boolean; /** * Remove a single listener from the dispatch queue. */ - remove(listener: Function, context?: any): Function; + remove(listener: (...params: T[]) => void, context?: any): Function; removeAll(): void; } diff --git a/types/signals/signals-tests.ts b/types/signals/signals-tests.ts index a0fa8e34f1..414b91edd7 100644 --- a/types/signals/signals-tests.ts +++ b/types/signals/signals-tests.ts @@ -1,8 +1,8 @@ import signals = require("signals"); // lifted from https://github.com/millermedeiros/js-signals/wiki/Examples interface TestObject { - started: signals.Signal; - stopped: signals.Signal; + started: signals.Signal; + stopped: signals.Signal; } namespace Signals.Tests { @@ -144,11 +144,11 @@ namespace Signals.AdvancedTests { var handler = function(){ alert('foo bar'); }; - var binding: signals.SignalBinding = myObject.started.add(handler); //methods `add()` and `addOnce()` returns a SignalBinding object + var binding: signals.SignalBinding<() => void> = myObject.started.add(handler); //methods `add()` and `addOnce()` returns a SignalBinding object binding.execute(); //will alert "foo bar" //Retrieve anonymous listener - var binding:signals.SignalBinding = myObject.started.add(function(){ + var binding:signals.SignalBinding<() => void> = myObject.started.add(function(){ alert('foo bar'); }); @@ -157,7 +157,7 @@ namespace Signals.AdvancedTests { var anonymousHandler = binding.getListener(); //reference to the anonymous function //Remove / Detach anonymous listener - var binding:signals.SignalBinding = myObject.started.add(function(){ + var binding:signals.SignalBinding<() => void> = myObject.started.add(function(){ alert('foo bar'); }); myObject.started.dispatch(); //will alert "foo bar" @@ -166,10 +166,10 @@ namespace Signals.AdvancedTests { myObject.started.dispatch(); //nothing happens //Check if binding will execute only once - var binding1:signals.SignalBinding = myObject.started.add(function(){ + var binding1:signals.SignalBinding = myObject.started.add(function(){ alert('foo bar'); }); - var binding2:signals.SignalBinding = myObject.started.addOnce(function(){ + var binding2:signals.SignalBinding<() => void> = myObject.started.addOnce(function(){ alert('foo bar'); }); alert(binding1.isOnce()); //alert "false" @@ -180,7 +180,7 @@ namespace Signals.AdvancedTests { var obj = { foo : "it's over 9000!" }; - var binding:signals.SignalBinding = myObject.started.add(function(){ + var binding:signals.SignalBinding<() => void> = myObject.started.add(function(){ alert(this.foo); }); myObject.started.dispatch(); //will alert "bar" @@ -188,7 +188,7 @@ namespace Signals.AdvancedTests { myObject.started.dispatch(); //will alert "it's over 9000!" //Add default parameters to Signal dispatch (v0.6.3+) - var binding:signals.SignalBinding = myObject.started.add(function(a:string, b:string, c:string){ + var binding:signals.SignalBinding<() => void> = myObject.started.add(function(a:string, b:string, c:string){ alert(a +' '+ b +' '+ c); }); binding.params = ['lorem', 'ipsum']; //set default parameters of the binding