Skip to content

The inference when using the new keyword doesn't work as expected. #61621

Closed as not planned
@D0nte53

Description

@D0nte53

Acknowledgement

  • I acknowledge that issues using this template may be closed without further explanation at the maintainer's discretion.

Comment

Hi, here’s my issue :

The inference when using the new keyword doesn't work as expected. I can't find a pattern that allows the types inferred by new to be the actual types inferred at instantiation, rather than just the types constrained by the class's generic parameters (e.g extends Record<string, string>)

ts-playground:

type t_Prisma<MNs extends Record<string, string> > = {
    ModelName: MNs
}


class Prisma1<P extends t_Prisma<MNs>, MNs extends Record<string, string>> implements t_Prisma<MNs> {
    _prisma: P;

    constructor(_prisma: P) {
        this._prisma = _prisma;
    }
    get ModelName() {
    return this._prisma.ModelName;
    }
}


class Prisma2<MNs extends Record<string, string>> implements t_Prisma<MNs> {
    _prisma: t_Prisma<MNs>;

    constructor(_prisma: t_Prisma<MNs>) {
        this._prisma = _prisma;
    }

    get ModelName() {
        return this._prisma.ModelName;
    }
}


const _Prisma = {
    ModelName:{
        Model1: "Model1",
        Model2: "Model2",
        Model3: "model3"
    } as const 
}

const prismaInstance1 = new Prisma1(_Prisma)
type test_ModelName1 = typeof prismaInstance1.ModelName

const prismaInstance2 = new Prisma2(_Prisma)
type test_ModelName2 = typeof prismaInstance2.ModelName

In the first code (Prisma1), the inference for ModelName doesn't work as expected (the inferred type is Record<string, string>), but it feels more natural.

In the second code (Prisma2), the inference works correctly ({Model1: "Model1", ...}), but it forces me to repeat the type t_Prisma<MNs> everywhere in the class definition , which is not ideal.

I really want to use the first pattern because it exactly represents what I want to do: parameterize a class with an object of type t_Prisma, but I'm not sure if it's a good practice since it doesn't work that way.

Thank you for your help and have a great day!

Metadata

Metadata

Assignees

No one assigned

    Labels

    QuestionAn issue which isn't directly actionable in code

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions