Microsoft/TypeScript
View on GitHubMixins created from `obj.constructor` cannot have members
Open
#61,255 opened on Feb 23, 2025
Domain: classesHelp WantedPossible Improvement
Repository metrics
- Stars
- (48,455 stars)
- PR merge metrics
- (Avg merge 6d 17h) (9 merged PRs in 30d)
Description
🔎 Search Terms
mixin constructor property instance
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about mixins
⏯ Playground Link
💻 Code
type Constructor<T> = new(...args: any[]) => T;
class Foo {
// Work around https://github.com/microsoft/TypeScript/issues/3841
declare ["constructor"]: Constructor<this>;
}
function Mixin1<T extends Constructor<Foo>>(superclass: T) {
// OK
return class extends superclass {
foof() {}
};
}
function Mixin2<T extends Foo>(obj: T) {
// Class '(Anonymous class)' incorrectly extends base class 'T'.
// '(Anonymous class)' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Foo'.
return class extends obj.constructor {
foof() {}
};
}
🙁 Actual behavior
Mixin1 compiles fine, but Mixin2 has an error:
Class '(Anonymous class)' incorrectly extends base class 'T'.
'(Anonymous class)' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'Foo'.
Removing the foof member causes it to compile without error.
🙂 Expected behavior
Both should compile fine because they are doing the same thing.
Additional information about the issue
No response