Microsoft/TypeScript

Mixin class with type param seems to lose information about default type parameter, causing "base constructors must all have the same return type"

Open

#56.005 aperta il 6 ott 2023

Vedi su GitHub
 (0 commenti) (4 reazioni) (0 assegnatari)TypeScript (6726 fork)batch import
BugDomain: classesHelp Wanted

Metriche repository

Star
 (48.455 star)
Metriche merge PR
 (Merge medio 6g 17h) (9 PR mergiate in 30 g)

Descrizione

🔎 Search Terms

Mixin class with type param seems to lose information about default type parameter, causing "base constructors must all have the same return type"

Related: https://github.com/microsoft/TypeScript/issues/37142 https://github.com/microsoft/TypeScript/issues/40110

🕗 Version & Regression Information

  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about mixins and type parameters

⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.2.2#code/CYUwxgNghgTiAEAXAngBwQYQPYDsDOiMArmIljACpogA8FAfPALzxQBGBMUp8OIA7vAAUASmaMKAbgBQ0sLgLwAQrHYQQAMWbw6KvAhAAPRCBzA88bPkIkylajQDybAFbhE9ekL0gAXPAofMSZGAG9peEio9k5uRHhIKDwLFS42dRpU7U4ASxwAc0YjEzMUpIRwqKqotlghQ39cgrFQ+DhEIhgceENJeABfCOrB6raQDq7lVXSQGX6ZOWhkqeB4YtNzKbT1DSFnN1IWwcWkiwBxLCxV9dKttU0913cRGibC+FD+oA

💻 Code

declare type ConstructorType<T> = abstract new () => T;

const BarableF = <TBase extends ConstructorType<Object>>(Base: TBase) => {
      abstract class Barable<Bar = string> extends Base {
          bar(x: string) { return x; }
      }
      return Barable;
};

class Bad extends BarableF(Object) {}

class Good extends BarableF(Object)<string> {}

🙁 Actual behavior

The line class Bad extends BarableF(Object) {} fails because "Base constructors must all have the same return type". If I hover over BarableF, I see the type

const BarableF: <ObjectConstructor>(Base: ObjectConstructor) => ((abstract new <**Bar**>() => BarableF<ObjectConstructor>.Barable<Bar>) & {
    ...;
}) & ObjectConstructor

where notably Bar has lost its default type param, which might be causing the issue.

🙂 Expected behavior

I would expect Bad to type-check without a problem, because in the Good example below it, you see that providing a type argument that is the same as the default for the type param causes things to work.

Additional information about the issue

No response

Guida contributor