Skip to content

type not inferred correctly in generic function #32109

@yaymukund

Description

@yaymukund

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

No one assigned

    Labels

    FixedA PR has been merged for this issue

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions