Skip to content

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

New issue

Have a question about this project? No Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “No Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? No Sign in to your account

Open
1 task done
D0nte53 opened this issue Apr 27, 2025 · 1 comment
Open
1 task done

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

D0nte53 opened this issue Apr 27, 2025 · 1 comment

Comments

@D0nte53
Copy link

D0nte53 commented Apr 27, 2025

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!

@MartinJohns
Copy link
Contributor

MartinJohns commented Apr 27, 2025

Constraints are not inference sites. So in your Prisma1 case there's nothing to infer the type of MNs from.

No Sign up for free to join this conversation on GitHub. Already have an account? No Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants