-
Notifications
You must be signed in to change notification settings - Fork 13k
Closed
Labels
FixedA PR has been merged for this issueA PR has been merged for this issue
Description
TypeScript Version: 3.5.2
Search Terms: generic type constraint undefined enum
Code
enum MyEvent {
Start = 'start',
Stop = 'stop',
}
interface MyEventOptions {
[MyEvent.Start]: { startTime: number },
[MyEvent.Stop]: { endTime: number },
}
class EventService {
private eventCounts: { [key in MyEvent]?: number };
constructor() {
// I don't want to have to list every possible enum member here
this.eventCounts = {};
}
private startEvent() {
this.report(MyEvent.Start, { startTime: 0 });
// This should be invalid:
//
// this.report(MyEvent.Start, { endTime: 0 });
}
private report<T extends keyof MyEventOptions>(event: T, options: MyEventOptions[T]) {
// errors with `Type 'undefined' is not assignable to type 'number'.`
const count: number = this.eventCounts[event] || 0;
// This would do, for example:
//
// request(mixpanelUrl, { name: event, options });
}
}
It doesn't complain if you change it to const count: number = (this.eventCounts.get(event) as number | undefined) || 0;
Expected behavior: Compiles without a problem.
Actual behavior:
Type '{ start?: number | undefined; stop?: number | undefined; }[T]' is not assignable to type 'number'.
Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
Playground Link: https://is.gd/S57reZ
Related Issues: #32017
Metadata
Metadata
Assignees
Labels
FixedA PR has been merged for this issueA PR has been merged for this issue