From c33522b34adca198008548273751ec11d4b38af7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Huan=20=28=E6=9D=8E=E5=8D=93=E6=A1=93=29?= Date: Tue, 9 Nov 2021 19:47:06 +0800 Subject: [PATCH 1/4] feat(fromEvent): add FromEvent type export --- index.d.ts | 6 ++++++ package.json | 7 +++++-- rxjs/index.d.ts | 25 +++++++++++++++++++++++++ rxjs/index.js | 1 + 4 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 rxjs/index.d.ts create mode 100644 rxjs/index.js diff --git a/index.d.ts b/index.d.ts index 6b0f0b4..792c92e 100644 --- a/index.d.ts +++ b/index.d.ts @@ -39,6 +39,12 @@ interface TypedEventEmitter { getMaxListeners (): number setMaxListeners (maxListeners: number): this + + /** + * required by `FromEvent` + * @see https://github.com/devanshj/rxjs-from-emitter/issues/4#issuecomment-665104646 + */ + __events: Events } export default TypedEventEmitter diff --git a/package.json b/package.json index 8954840..314f2d2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typed-emitter", - "version": "1.4.0", + "version": "1.5.0", "license": "MIT", "description": "Strictly typed event emitter interface for TypeScript 3.", "author": "Andy Wermke (https://github.com/andywer)", @@ -12,5 +12,8 @@ "interface" ], "main": "./types.js", - "types": "./index.d.ts" + "types": "./index.d.ts", + "optionalDependencies": { + "rxjs": "*" + } } diff --git a/rxjs/index.d.ts b/rxjs/index.d.ts new file mode 100644 index 0000000..9fecfd7 --- /dev/null +++ b/rxjs/index.d.ts @@ -0,0 +1,25 @@ +/** + * devanshj/rxjs-from-emitter#4 - typed-emitter compatibility + * + * @see https://github.com/devanshj/rxjs-from-emitter/issues/4#issuecomment-665104646 + */ +/* eslint-disable no-use-before-define */ +import { + fromEvent as rxjsFromEvent, + Observable, +} from 'rxjs' +import type TypedEventEmitter from 'typed-emitter' + +type ObservedValue = + A['length'] extends 0 ? void : + A['length'] extends 1 ? A[0] : + A + +interface FromTypedEvent { + < Emitter extends TypedEventEmitter + , EventName extends keyof Events + , Events = Emitter extends TypedEventEmitter ? T : never + >(emitter: Emitter, event: EventName): Observable any ? A : never>> +} + +export type FromEvent = FromTypedEvent & typeof rxjsFromEvent diff --git a/rxjs/index.js b/rxjs/index.js new file mode 100644 index 0000000..06f1e08 --- /dev/null +++ b/rxjs/index.js @@ -0,0 +1 @@ +// https://github.com/octokit/openapi-types.ts/issues/16#issuecomment-772784156 From 10d61959a9134b1f3e543fe8adac5f5cee3fa4d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Huan=20=28=E6=9D=8E=E5=8D=93=E6=A1=93=29?= Date: Tue, 9 Nov 2021 19:54:40 +0800 Subject: [PATCH 2/4] feat(fromEvent): add README docs --- README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/README.md b/README.md index a8e8053..8be102b 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,23 @@ class MyEventEmitter extends (EventEmitter as { new(): TypedEmitter })< } ``` +## RxJS `fromEvent` types inference + +The default `fromEvent` from RxJS will return an `Observable` for our typed emitter. + +This can be fixed by the following code, by replacing the `fromEvent` type with our enhanced one: `FromEvent`: + +```ts +import { fromEvent as rxjsFromEvent } from "rxjs" +import { FromEvent } from "typed-emitter/rxjs" + +// The `Observable` typing can be correctly inferenced +const fromEvent = rxjsFromEvent as FromEvent +``` + +Learn more from [rxjs fromEvent compatibility #9](https://github.com/andywer/typed-emitter/issues/9) +for the `fromEvent` compatibility discussions. + ## Why another package? The interface that comes with `@types/node` is not type-safe at all. It does not even offer a way of specifying the events that the emitter will emit... From 4cbc27b7b96330472221d9ce5d770ed45bb819c3 Mon Sep 17 00:00:00 2001 From: Andy Wermke Date: Wed, 10 Nov 2021 14:03:30 +0100 Subject: [PATCH 3/4] Let's not bump the version just yet --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 314f2d2..e385696 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "typed-emitter", - "version": "1.5.0", + "version": "1.4.0", "license": "MIT", "description": "Strictly typed event emitter interface for TypeScript 3.", "author": "Andy Wermke (https://github.com/andywer)", From c1f4607ae7d462dab54ada1998152901ded507eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Huan=20=28=E6=9D=8E=E5=8D=93=E6=A1=93=29?= Date: Wed, 10 Nov 2021 22:41:06 +0800 Subject: [PATCH 4/4] feat(fromEvent): rename rxjsFromEvent -> rxFromEvent for friendlier --- README.md | 4 ++-- rxjs/index.d.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8be102b..cc0d4cf 100644 --- a/README.md +++ b/README.md @@ -72,11 +72,11 @@ The default `fromEvent` from RxJS will return an `Observable` for our t This can be fixed by the following code, by replacing the `fromEvent` type with our enhanced one: `FromEvent`: ```ts -import { fromEvent as rxjsFromEvent } from "rxjs" +import { fromEvent as rxFromEvent } from "rxjs" import { FromEvent } from "typed-emitter/rxjs" // The `Observable` typing can be correctly inferenced -const fromEvent = rxjsFromEvent as FromEvent +const fromEvent = rxFromEvent as FromEvent ``` Learn more from [rxjs fromEvent compatibility #9](https://github.com/andywer/typed-emitter/issues/9) diff --git a/rxjs/index.d.ts b/rxjs/index.d.ts index 9fecfd7..62bdce4 100644 --- a/rxjs/index.d.ts +++ b/rxjs/index.d.ts @@ -5,10 +5,10 @@ */ /* eslint-disable no-use-before-define */ import { - fromEvent as rxjsFromEvent, + fromEvent as rxFromEvent, Observable, } from 'rxjs' -import type TypedEventEmitter from 'typed-emitter' +import type TypedEventEmitter from '../index' type ObservedValue = A['length'] extends 0 ? void : @@ -22,4 +22,4 @@ interface FromTypedEvent { >(emitter: Emitter, event: EventName): Observable any ? A : never>> } -export type FromEvent = FromTypedEvent & typeof rxjsFromEvent +export type FromEvent = FromTypedEvent & typeof rxFromEvent