Skip to content

Generic type of superclass cannot be inferred from function call on a subclass #20348

Closed

Description

TypeScript Version: 2.7.0-dev.20171129

Code

class Evented<M> {
    // protected __typeMap__?: M; 
    on<K extends keyof M>(type: K, listener: (event: M[K]) => void) { }
}

function on<M, K extends keyof M>(target: Evented<M>, type: K, listener: (event: M[K]) => void) { }

interface EventMap {
    change: { type: 'change'; };
}

const e = new Evented<EventMap>();
e.on('change', (event) => { }); // type of event: { type: 'change' }
on(e, 'change', (event) => { }); // type of event: { type: 'change' }

class SubEvented extends Evented<EventMap> { }

const s = new SubEvented();
s.on('change', (event) => { }); // type of event: { type: 'change' }
on(s, 'change', (event) => { }); // type of event: M[K]

Expected behavior:
event is inferred as { type: 'change' } on line 20 (last line)

Actual behavior:
Line 20 is flagged as an error:

error TS2345: Argument of type '"change"' is not assignable to parameter of type 'never'.

Currently, the only way to get line 20 to work as expected is to uncomment line 2.

Activity

  1. mhegazy commented on Nov 29, 2017

    @mhegazy
    Contributor

    Should be fixed by #20126

  2. mhegazy commented on Nov 29, 2017

    @mhegazy
    Contributor

    it is worth noting that the inference here for M will not be EventMap, since the there is no manifestation for this type to be inferred from. however, with #20126, M will be inferred from the use M[K] to be a type with a property named K (or "change" in the example above).

  3. added
    Working as IntendedThe behavior described is the intended behavior; this is not a bug
    and removed
    BugA bug in TypeScript
    on Dec 16, 2021
  4. RyanCavanaugh commented on Dec 16, 2021

    @RyanCavanaugh
    Member

    This is the intended behavior -- there is no inference site for M

  5. locked as resolved and limited conversation to collaborators on Oct 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Working as IntendedThe behavior described is the intended behavior; this is not a bug

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions