From b6df0d2d358f13465d0ada53857d33d3700ad265 Mon Sep 17 00:00:00 2001 From: Aaron Friel Date: Tue, 12 Mar 2019 23:06:04 -0700 Subject: [PATCH 1/2] Tighten up multiArgs type constraints. --- index.d.ts | 77 ++++++++++++++++++++++++------------------------- index.test-d.ts | 6 ++-- 2 files changed, 41 insertions(+), 42 deletions(-) diff --git a/index.d.ts b/index.d.ts index c82ff17..6a0cf54 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,23 +1,22 @@ /// -export type AddRemoveListener = ( +export type AddRemoveListener = ( event: string | symbol, listener: ( - firstArgument: FirstArgumentType, - ...rest: RestArgumentsType[] + ...args: Args, ) => void ) => void; -export interface Emitter { - on?: AddRemoveListener; - addListener?: AddRemoveListener; - addEventListener?: AddRemoveListener; - off?: AddRemoveListener; - removeListener?: AddRemoveListener; - removeEventListener?: AddRemoveListener; +export interface Emitter { + on?: AddRemoveListener; + addListener?: AddRemoveListener; + addEventListener?: AddRemoveListener; + off?: AddRemoveListener; + removeListener?: AddRemoveListener; + removeEventListener?: AddRemoveListener; } -export type FilterFunction = (element: ElementType) => boolean; +export type FilterFunction = (... args: ElementType) => boolean; export interface CancelablePromise extends Promise { cancel(): void; @@ -30,20 +29,20 @@ export interface CancelablePromise extends Promise { * @param event - Name of the event or events to listen to. If the same event is defined both here and in `rejectionEvents`, this one takes priority. **Note**: `event` is a string for a single event type, for example, `'data'`. To listen on multiple events, pass an array of strings, such as `['started', 'stopped']`. * @returns A `Promise` that is fulfilled when emitter emits an event matching `event`, or rejects if emitter emits any of the events defined in the `rejectionEvents` option. The returned promise has a `.cancel()` method, which when called, removes the event listeners and causes the promise to never be settled. */ -declare function pEvent( - emitter: Emitter, +declare function pEvent( + emitter: Emitter, event: string | symbol | (string | symbol)[], - options: MultiArgumentsOptions -): CancelablePromise<(EmittedType | EmittedTypeRest)[]>; + options: MultiArgumentsOptions +): CancelablePromise; declare function pEvent( - emitter: Emitter, + emitter: Emitter<[EmittedType]>, event: string | symbol | (string | symbol)[], - filter: FilterFunction + filter: FilterFunction<[EmittedType]> ): CancelablePromise; declare function pEvent( - emitter: Emitter, + emitter: Emitter<[EmittedType]>, event: string | symbol | (string | symbol)[], - options?: Options + options?: Options<[EmittedType]> ): CancelablePromise; export default pEvent; @@ -51,37 +50,37 @@ export default pEvent; /** * Wait for multiple event emissions. Returns an array. */ -export function multiple( - emitter: Emitter, +export function multiple( + emitter: Emitter, event: string | symbol | (string | symbol)[], - options: MultipleMultiArgumentsOptions -): CancelablePromise<(EmittedType | EmittedTypeRest)[][]>; + options: MultipleMultiArgumentsOptions +): CancelablePromise; export function multiple( - emitter: Emitter, + emitter: Emitter<[EmittedType]>, event: string | symbol | (string | symbol)[], - options: MultipleOptions + options: MultipleOptions<[EmittedType]> ): CancelablePromise; /** * @returns An [async iterator](http://2ality.com/2016/10/asynchronous-iteration.html) that lets you asynchronously iterate over events of `event` emitted from `emitter`. The iterator ends when `emitter` emits an event matching any of the events defined in `resolutionEvents`, or rejects if `emitter` emits any of the events defined in the `rejectionEvents` option. */ -export function iterator( - emitter: Emitter, +export function iterator( + emitter: Emitter, event: string | symbol | (string | symbol)[], - options: IteratorMultiArgumentsOptions -): AsyncIterableIterator<(EmittedType | EmittedTypeRest)[]>; + options: IteratorMultiArgumentsOptions +): AsyncIterableIterator; export function iterator( - emitter: Emitter, + emitter: Emitter<[EmittedType]>, event: string | symbol | (string | symbol)[], - filter: FilterFunction + filter: FilterFunction<[EmittedType]> ): AsyncIterableIterator; export function iterator( - emitter: Emitter, + emitter: Emitter<[EmittedType]>, event: string | symbol | (string | symbol)[], - options?: IteratorOptions + options?: IteratorOptions<[EmittedType]> ): AsyncIterableIterator; -export interface Options { +export interface Options { /** * Events that will reject the promise. * @@ -128,11 +127,11 @@ export interface Options { readonly filter?: FilterFunction; } -export interface MultiArgumentsOptions extends Options { +export interface MultiArgumentsOptions extends Options { readonly multiArgs: true; } -export interface MultipleOptions extends Options { +export interface MultipleOptions extends Options { /** * The number of times the event needs to be emitted before the promise resolves. */ @@ -174,11 +173,11 @@ export interface MultipleOptions extends Options { readonly resolveImmediately?: boolean; } -export interface MultipleMultiArgumentsOptions extends MultipleOptions { +export interface MultipleMultiArgumentsOptions extends MultipleOptions { readonly multiArgs: true; } -export interface IteratorOptions extends Options { +export interface IteratorOptions extends Options { /** * Maximum number of events for the iterator before it ends. When the limit is reached, the iterator will be marked as `done`. This option is useful to paginate events, for example, fetching 10 events per page. * @@ -194,7 +193,7 @@ export interface IteratorOptions extends Options { resolutionEvents?: (string | symbol)[]; } -export interface IteratorMultiArgumentsOptions +export interface IteratorMultiArgumentsOptions extends IteratorOptions { multiArgs: true; } diff --git a/index.test-d.ts b/index.test-d.ts index a332bc0..2d7b798 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -75,7 +75,7 @@ expectType>( expectType>( pEvent(new NodeEmitter(), 'finish', {filter: value => value > 3}) ); -expectType>( +expectType>( pEvent(new NodeEmitter(), 'finish', {multiArgs: true}) ); @@ -90,7 +90,7 @@ expectType>( count: Infinity }) ); -expectType>( +expectType>( multiple(new NodeEmitter(), 'hello', { count: Infinity, multiArgs: true @@ -110,7 +110,7 @@ expectType>( expectType>( iterator(new NodeEmitter(), 'finish', {resolutionEvents: ['finish']}) ); -expectType>( +expectType>( iterator(new NodeEmitter(), 'finish', {multiArgs: true}) ); From 831d2d5ae35f409f32193e3f58b50f8aeb621c7c Mon Sep 17 00:00:00 2001 From: Aaron Friel Date: Tue, 12 Mar 2019 23:42:54 -0700 Subject: [PATCH 2/2] PR comments: use unknown[] over any[], fix formatting --- index.d.ts | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/index.d.ts b/index.d.ts index 6a0cf54..da6464b 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,13 +1,13 @@ /// -export type AddRemoveListener = ( +export type AddRemoveListener = ( event: string | symbol, listener: ( - ...args: Args, + ...args: Arguments, ) => void ) => void; -export interface Emitter { +export interface Emitter { on?: AddRemoveListener; addListener?: AddRemoveListener; addEventListener?: AddRemoveListener; @@ -16,7 +16,7 @@ export interface Emitter { removeEventListener?: AddRemoveListener; } -export type FilterFunction = (... args: ElementType) => boolean; +export type FilterFunction = (...args: ElementType) => boolean; export interface CancelablePromise extends Promise { cancel(): void; @@ -29,7 +29,7 @@ export interface CancelablePromise extends Promise { * @param event - Name of the event or events to listen to. If the same event is defined both here and in `rejectionEvents`, this one takes priority. **Note**: `event` is a string for a single event type, for example, `'data'`. To listen on multiple events, pass an array of strings, such as `['started', 'stopped']`. * @returns A `Promise` that is fulfilled when emitter emits an event matching `event`, or rejects if emitter emits any of the events defined in the `rejectionEvents` option. The returned promise has a `.cancel()` method, which when called, removes the event listeners and causes the promise to never be settled. */ -declare function pEvent( +declare function pEvent( emitter: Emitter, event: string | symbol | (string | symbol)[], options: MultiArgumentsOptions @@ -50,7 +50,7 @@ export default pEvent; /** * Wait for multiple event emissions. Returns an array. */ -export function multiple( +export function multiple( emitter: Emitter, event: string | symbol | (string | symbol)[], options: MultipleMultiArgumentsOptions @@ -64,7 +64,7 @@ export function multiple( /** * @returns An [async iterator](http://2ality.com/2016/10/asynchronous-iteration.html) that lets you asynchronously iterate over events of `event` emitted from `emitter`. The iterator ends when `emitter` emits an event matching any of the events defined in `resolutionEvents`, or rejects if `emitter` emits any of the events defined in the `rejectionEvents` option. */ -export function iterator( +export function iterator( emitter: Emitter, event: string | symbol | (string | symbol)[], options: IteratorMultiArgumentsOptions @@ -80,7 +80,7 @@ export function iterator( options?: IteratorOptions<[EmittedType]> ): AsyncIterableIterator; -export interface Options { +export interface Options { /** * Events that will reject the promise. * @@ -127,11 +127,11 @@ export interface Options { readonly filter?: FilterFunction; } -export interface MultiArgumentsOptions extends Options { +export interface MultiArgumentsOptions extends Options { readonly multiArgs: true; } -export interface MultipleOptions extends Options { +export interface MultipleOptions extends Options { /** * The number of times the event needs to be emitted before the promise resolves. */ @@ -173,11 +173,11 @@ export interface MultipleOptions extends Options extends MultipleOptions { +export interface MultipleMultiArgumentsOptions extends MultipleOptions { readonly multiArgs: true; } -export interface IteratorOptions extends Options { +export interface IteratorOptions extends Options { /** * Maximum number of events for the iterator before it ends. When the limit is reached, the iterator will be marked as `done`. This option is useful to paginate events, for example, fetching 10 events per page. * @@ -193,7 +193,7 @@ export interface IteratorOptions extends Options +export interface IteratorMultiArgumentsOptions extends IteratorOptions { multiArgs: true; }