Merge pull request #31630 from BendingBender/ee-first

[ee-first] Add types
This commit is contained in:
Wesley Wigham
2018-12-24 21:23:48 -08:00
committed by GitHub
4 changed files with 104 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
import first = require('ee-first');
import { EventEmitter } from 'events';
class Foo extends EventEmitter {
foo: 'foo';
}
class Bar extends EventEmitter {
bar: 'bar';
}
const ee1 = new Foo();
const ee2 = new Bar();
const thunk = first<Foo | Bar>(
[[ee1, 'close', 'end', 'error'], [ee2, 'error']],
(err, ee, event, args) => {
err; // $ExpectType any
ee; // $ExpectType Foo | Bar
event; // $ExpectType string[]
args; // $ExpectType any[]
}
);
thunk((err, ee, event, args) => {
err; // $ExpectType any
ee; // $ExpectType Foo | Bar
event; // $ExpectType string[]
args; // $ExpectType any[]
});
thunk.cancel();
+48
View File
@@ -0,0 +1,48 @@
// Type definitions for ee-first 1.1
// Project: https://github.com/jonathanong/ee-first
// Definitions by: BendingBender <https://github.com/BendingBender>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
// TypeScript Version: 3.0
/// <reference types="node" />
import { EventEmitter } from 'events';
export = first;
/**
* Get the first event in a set of event emitters and event pairs, then clean up after itself.
* Invoke `listener` on the first event from the list specified in `eventSpec`.
*
* @param eventSpec Array of arrays, with each array in the format `[ee, ...event]`.
* @param listener Will be called only once, the first time any of the given events are emitted.
* If `error` is one of the listened events, then if that fires first, the `listener` will be given the `err` argument.
* `listener`'s arguments:
* - `err`: the first argument emitted from an error event, if applicable
* - `ee`: the event emitter that fired
* - `event`: the string event name that fired
* - `args`: an array of the arguments that were emitted on the event
*/
declare function first<TEmitter extends EventEmitter>(
eventSpec: Array<[TEmitter, ...string[]]>,
listener: first.Listener<TEmitter>
): first.Thunk<TEmitter>;
declare namespace first {
type Listener<TEmitter extends EventEmitter> = (
err: any,
ee: TEmitter,
event: string[],
args: any[]
) => void;
interface Thunk<TEmitter extends EventEmitter> {
(listener: Listener<TEmitter>): void;
/**
* The group of listeners can be cancelled before being invoked and have all the event listeners removed
* from the underlying event emitters.
*/
cancel(): void;
}
}
+23
View File
@@ -0,0 +1,23 @@
{
"compilerOptions": {
"module": "commonjs",
"lib": [
"es6"
],
"noImplicitAny": true,
"noImplicitThis": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"baseUrl": "../",
"typeRoots": [
"../"
],
"types": [],
"noEmit": true,
"forceConsistentCasingInFileNames": true
},
"files": [
"index.d.ts",
"ee-first-tests.ts"
]
}
+1
View File
@@ -0,0 +1 @@
{ "extends": "dtslint/dt.json" }