Mixin class with type param seems to lose information about default type parameter, causing "base constructors must all have the same return type"
#56.005 aberto em 6 de out. de 2023
Métricas do repositório
- Stars
- (48.455 stars)
- Métricas de merge de PR
- (Mesclagem média 6d 17h) (9 fundiu PRs em 30d)
Description
🔎 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
💻 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