From b4320f5dd60382866a79574e9e08e2ffa72c5354 Mon Sep 17 00:00:00 2001 From: Steven Luscher Date: Fri, 4 Oct 2024 19:13:43 +0000 Subject: [PATCH] =?UTF-8?q?Revert=20=E2=80=98no=20argument=E2=80=99=20cond?= =?UTF-8?q?itional=20type=20from=20#3301?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../__typetests__/data-publisher-typetest.ts | 20 +++++++++++++++++-- packages/subscribable/src/data-publisher.ts | 12 ++++------- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/subscribable/src/__typetests__/data-publisher-typetest.ts b/packages/subscribable/src/__typetests__/data-publisher-typetest.ts index 923dac35661..98826ef1238 100644 --- a/packages/subscribable/src/__typetests__/data-publisher-typetest.ts +++ b/packages/subscribable/src/__typetests__/data-publisher-typetest.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/ban-ts-comment */ import { DataPublisher, getDataPublisherFromEventEmitter } from '../data-publisher'; -import { TypedEventEmitter } from '../event-emitter'; +import { TypedEventEmitter, TypedEventTarget } from '../event-emitter'; type ChannelMap = { fall: null; @@ -12,7 +12,7 @@ const publisher = null as unknown as DataPublisher; // [DESCRIBE] getDataPublisherFromEventEmitter { - // It materializes listener signatures based on the events of the emitter + // It materializes listener signatures based on the events of an event emitter { const eventEmitter = null as unknown as TypedEventEmitter<{ baz: Event; @@ -23,6 +23,22 @@ const publisher = null as unknown as DataPublisher; data satisfies 'bar'; }); publisher.on('baz', (...args) => { + // @ts-ignore FIXME: The actual implementation supplies no arguments, not `null` + args satisfies []; + }); + } + // It materializes listener signatures based on the events of an event target + { + const eventTarget = null as unknown as TypedEventTarget<{ + baz: Event; + foo: CustomEvent<'bar'>; + }>; + const publisher = getDataPublisherFromEventEmitter(eventTarget); + publisher.on('foo', data => { + data satisfies 'bar'; + }); + publisher.on('baz', (...args) => { + // @ts-ignore FIXME: The actual implementation supplies no arguments, not `null` args satisfies []; }); } diff --git a/packages/subscribable/src/data-publisher.ts b/packages/subscribable/src/data-publisher.ts index 13722514d10..59367bf2fc7 100644 --- a/packages/subscribable/src/data-publisher.ts +++ b/packages/subscribable/src/data-publisher.ts @@ -1,23 +1,19 @@ -import { TypedEventEmitter } from './event-emitter'; +import { TypedEventEmitter, TypedEventTarget } from './event-emitter'; type UnsubscribeFn = () => void; export interface DataPublisher = Record> { on( channelName: TChannelName, - subscriber: ( - ...data: TDataByChannelName[TChannelName] extends never ? [] : [data: TDataByChannelName[TChannelName]] - ) => void, + subscriber: (data: TDataByChannelName[TChannelName]) => void, options?: { signal: AbortSignal }, ): UnsubscribeFn; } export function getDataPublisherFromEventEmitter>( - eventEmitter: TypedEventEmitter, + eventEmitter: TypedEventEmitter | TypedEventTarget, ): DataPublisher<{ - [TEventType in keyof TEventMap]: TEventMap[TEventType] extends CustomEvent - ? TEventMap[TEventType]['detail'] - : never; + [TEventType in keyof TEventMap]: TEventMap[TEventType] extends CustomEvent ? TEventMap[TEventType]['detail'] : null; }> { return { on(channelName, subscriber, options) {