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 创建于 2023年10月6日
仓库指标
- Star
- (48,455 star)
- PR 合并指标
- (平均合并 6天 17小时) (30 天内合并 9 个 PR)
描述
🔎 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