Observable workaround for on.

This commit is contained in:
Simon Seyock
2021-06-23 14:27:14 +02:00
committed by Andreas Hocevar
parent ba9bfca9d5
commit 25a095e489
+30 -10
View File
@@ -7,8 +7,13 @@ import {listen, listenOnce, unlistenByKey} from './events.js';
/*** /***
* @template {string} Type * @template {string} Type
* @template {Event|import("./events/Event.js").default} EventClass * @template {import("./events/Event.js").default} EventClass
* @typedef {(type: Type|Type[], listener: (event: EventClass) => (void|boolean)) => import("./events.js").EventsKey|Array<import("./events.js").EventsKey>} OnSignature * @typedef {(type: Type|Type[], listener: (event: EventClass) => (void|boolean)) => import("./events").EventsKey|Array<import("./events").EventsKey>} OnSignature
*/
/***
* @template {string} Type
* @typedef {(type: Type[], listener: (event: import("./events/Event").default) => (void|boolean)) => import("./events").EventsKey|Array<import("./events").EventsKey>} CombinedOnSignature
*/ */
/** /**
@@ -30,6 +35,11 @@ class Observable extends EventTarget {
constructor() { constructor() {
super(); super();
/***
* @type {OnSignature<EventTypes, import("./events/Event.js").default>}
*/
this.on = this.onInternal;
/** /**
* @private * @private
* @type {number} * @type {number}
@@ -57,15 +67,13 @@ class Observable extends EventTarget {
} }
/** /**
* Listen for a certain type of event. * @param {string|Array<string>} type Type.
* @param {string|Array<string>} type The event type or array of event types. * @param {function(import("./events/Event").default): (void|boolean)} listener Listener.
* @param {function(?): ?} listener The listener function. * @return {import("./events.js").EventsKey|Array<import("./events.js").EventsKey>} Event key.
* @return {import("./events.js").EventsKey|Array<import("./events.js").EventsKey>} Unique key for the listener. If * @protected
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/ */
on(type, listener) { // the jsdoc api annotation follows below the class declaration.
onInternal(type, listener) {
if (Array.isArray(type)) { if (Array.isArray(type)) {
const len = type.length; const len = type.length;
const keys = new Array(len); const keys = new Array(len);
@@ -122,6 +130,18 @@ class Observable extends EventTarget {
} }
} }
/**
* Listen for a certain type of event.
* @function
* @param {string|Array<string>} type The event type or array of event types.
* @param {function(?): ?} listener The listener function.
* @return {import("./events.js").EventsKey|Array<import("./events.js").EventsKey>} Unique key for the listener. If
* called with an array of event types as the first argument, the return
* will be an array of keys.
* @api
*/
Observable.prototype.on;
/** /**
* Removes an event listener using the key returned by `on()` or `once()`. * Removes an event listener using the key returned by `on()` or `once()`.
* @param {import("./events.js").EventsKey|Array<import("./events.js").EventsKey>} key The key returned by `on()` * @param {import("./events.js").EventsKey|Array<import("./events.js").EventsKey>} key The key returned by `on()`