Skip to content

TS2345 error with derivated types from a map of types #35613

Closed
@lgraziani2712

Description

@lgraziani2712

TypeScript Version: 3.7.2

Search Terms: ts2345 derivated type error

I really don't know how to describe this bug in short terms.

Code

enum A {
    a = 'a',
    b = 'b'
}

interface ObjA {
    prop1: string;
}
interface ObjB {
    prop2: number;
}

type PayloadMap = {
    [A.a]: ObjA;
    [A.b]: ObjB;
}

type Content<T extends A> = {
    type: T;
    payload: PayloadMap[T];
}

function processContent<T extends A>(content: Content<T>) {
    parserPayload[content.type](content.payload);
//                              ^=========== here is the error
}

const parserPayload: { [key in A]: (payload: PayloadMap[key]) => any } = {
//                                           ^============ because this is treated
//                                                         as an intersection
    a: payload => payload.prop1,
    b: payload => payload.prop2,
}

Expected behavior: To correctly know that PayloadMap[key] is in fact the same as PayloadMap[T] since key matches T.

Actual behavior:

Argument of type 'PayloadMap[T]' is not assignable to parameter of type 'ObjA & ObjB'.

Playground Link: https://www.typescriptlang.org/play/?ssl=1&ssc=1&pln=30&pc=2#code/KYOwrgtgBAglDeAoKKoEMoF4oHI04BplUAjLXEnRAX0UQEsQAXYAJwDM0BjYKAeRIArOElRQADqwD24gIwAuKAGcmrRgHMA3DQbM2nHvyEAhBMRSSZAJkXgIJNttqImAT3G8ACmlcAbKWgAJgCyaOLkoqgA2jAAdGgAuooCwtpiMbEkSUaCxk50bh5QAMJSeswAPAAqUMAAHiwggUqwAHwR5lCFwIpVaajiPv5Bit5+ASFhUVUJ+YjsYCBcTPRlEtI8Skql5UzVtQ2gzW0AFFxljUyKO5fVrQCUZmKDrEpsY8OBUee7sd0JZwuoCYsUG4yC9zmPxUEjQr3eQwmingUCiAGtgK4oIxYNkTmDPqNEUFQuJ0ZiEo9MO00CAsdQOmI0IoCRMsO1WUFQdI5EQxCQWcTAuzYeDAtzrERqEA

Related Issues:

Metadata

Metadata

Assignees

No one assigned

    Labels

    DuplicateAn existing issue was already created

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions