Closed
Description
TypeScript Version: 3.3.0-dev.20181129
Search Terms:
The search results led to issues like this one: #6307
Code
// ./Events.ts
class EventTypes {
constructor(
public SOME_EVENT: any,
public OTHER_EVENT: any,
) {}
}
export const Events = {} as { [k in keyof EventTypes]: k }
for (const key in new (EventTypes as any)) {
Events[key] = key
}
import * as events from 'events' // definitions are from `@types/node`
// our own (better, more type-safe) definition of EventEmitter
interface BetterEventEmitter<EventTypes> {
new(): BetterEventEmitter<EventTypes>
addListener<EventName extends keyof EventTypes> (event: EventName, listener: (arg: EventTypes[EventName]) => void);
on<EventName extends keyof EventTypes> (event: EventName, listener: (arg: EventTypes[EventName]) => void);
once<EventName extends keyof EventTypes> (event: EventName, listener: (arg: EventTypes[EventName]) => void);
removeListener<EventName extends keyof EventTypes> (event: EventName, listener: (arg: EventTypes[EventName]) => void);
removeAllListeners<EventName extends keyof EventTypes>(event?: EventName): this;
emit<EventName extends keyof EventTypes>(event: EventName, arg: EventTypes[EventName]): boolean;
eventNames<EventName extends keyof EventTypes>(): Array<EventName>;
setMaxListeners(n: number): this;
getMaxListeners(): number;
listeners<EventName extends keyof EventTypes>(event: EventName): (arg: EventTypes[EventName]) => void[];
listenerCount<EventName extends keyof EventTypes>(type: EventName): number;
prependListener<EventName extends keyof EventTypes>(event: EventName, listener: (arg: EventTypes[EventName]) => void): this;
prependOnceListener<EventName extends keyof EventTypes>(event: EventName, listener: (arg: EventTypes[EventName]) => void): this;
}
// override Node EventEmitter with our definition
export const EventEmitter = events.EventEmitter as unknown as BetterEventEmitter<EventTypes>
// consumer.ts
import { Events, EventEmitter } from './models/Events' // ERROR: `EventEmitter` is declared but its value is never read.
const channel = new EventEmitter // works fine, no error!
class Foo {
channel: EventEmitter // ERROR, Cannot find name 'EventEmitter'
}
export interface Bar {
channel: EventEmitter // ERROR, Cannot find name 'EventEmitter', property 'channel' of exported interface has or is using private name 'EventEmitter'.
}
Expected behavior:
I expect not to get the ERROR
s I've marked in the above comments.
Actual behavior:
I'm getting those errors.
Playground Link:
I can't put multiple files in Playground or install dependencies.
Related Issues: