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) {