[SignalsJS] Add Generic type support (#20429)

* [SignalsJS] Add Generic type support

* Any as default Signal type

* Add default any types for other declarations
This commit is contained in:
Luc Matagne
2017-10-17 17:05:03 +02:00
committed by Andy
parent 0905b3d2f9
commit 5d2d699e6b
2 changed files with 21 additions and 21 deletions

View File

@@ -10,23 +10,23 @@ export as namespace signals;
declare namespace signals {
interface SignalWrapper {
Signal: Signal
interface SignalWrapper<T = any> {
Signal: Signal<T>
}
interface SignalBinding {
interface SignalBinding<T = any> {
active: boolean;
context: any;
params: any;
detach(): Function;
execute(paramsArr?: any[]): any;
getListener(): Function;
getSignal(): Signal;
getListener(): (...params: T[]) => void;
getSignal(): Signal<T>;
isBound(): boolean;
isOnce(): boolean;
}
interface Signal {
interface Signal<T = any> {
/**
* Custom event broadcaster
* <br />- inspired by Robert Penner's AS3 Signals.
@@ -34,7 +34,7 @@ declare namespace signals {
* @author Miller Medeiros
* @constructor
*/
new (): Signal;
new (): Signal<T>;
/**
* 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<T>;
/**
* 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<T>;
/**
* 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;
}

View File

@@ -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<any>;
stopped: signals.Signal<any>;
}
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<any> = 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