Closed
Description
TypeScript Version: 2.9.2 and next@2018-08-24
Search Terms:
mapped type inference type guard
Code
type Listeners<K extends keyof EVENTS, EVENTS> = Array<(data: EVENTS[K]) => void>
export default class EventManager<EVENTS extends {}> {
private listeners: { [K in keyof EVENTS]?: Listeners<K, EVENTS> } = {}
private getListeners<K extends keyof EVENTS>(name: K): Array<(data: EVENTS[K]) => void> {
// It works if we help the compiler with... the type it has for real
// let listeners: Array<(data: EVENTS[K]) => void> | undefined = this.listeners[name]
let listeners = this.listeners[name]
if (!listeners) {
const newArray = this.listeners[name] = []
return newArray
}
else {
// Type guard fails! Nothing was refined
return listeners
}
}
}
Expected behavior:
The type is correctly inferred and the type guard does something
Playground Link: