microsoft / microsoft/TypeScript
Mixin with abstract class infers wrong type for super
Dieses Issue hat noch niemand übernommen.
- Vorherrschende Sprache
- Go
- Sterne
- 111k
- Forks
- 14.4k
- Ø Merge
- 1 T. 19 Std.
- Gemergte PRs (30 T.)
- 117
Beschreibung
🔎 Search Terms
"mixin abstract super", "mixin abstract super type", "mixin abstract constructor super", "mixin abstract constructor super type", "mixin Abstract method cannot be accessed via super expression"
🕗 Version & Regression Information
- This is the behavior in every version I tried, and I reviewed the FAQ for entries about "super"
⏯ Playground Link
💻 Code
abstract class MyAbstractClass {
public abstract getName(): string;
}
function mixinWithAbstractClass<TBase extends new (...args: any[]) => MyAbstractClass>(_base: TBase) {
class MixinClass extends _base {
public getName(): string {
return super.getName(); // Error: "Abstract method 'getName' in class 'MyAbstractClass' cannot be accessed via super expression."
}
}
return MixinClass;
}
interface MyInterface {
getName(): string;
}
function mixinWithInterface<TBase extends new (...args: any[]) => MyInterface>(_base: TBase) {
class MixinClass extends _base {
public getName(): string {
return super.getName(); // works as expected
}
}
return MixinClass;
}
🙁 Actual behavior
mixinWithAbstractClass fails because the compiler infers that super is of the exact type class MyAbstractClass.
🙂 Expected behavior
I expected mixinWithAbstractClass to compile like mixinWithInterface does. The constraint TBase extends new (...args: any[]) => MyAbstractClass specifies that TBase extends a concrete constructor, which returns instances that conform to MyAbstractClass. Since the constructor is concrete, we can infer that TBase (the superclass) already implements the abstract methods.
Additional information about the issue
No response
Beitragsleitfaden
Erste Schritte
- Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
- Forke das Repository und arbeite in einem Branch.
- Öffne einen Pull Request, der die Issue-Nummer nennt.
Rechercherichtung
Beginne mit der verknüpften TypeScript Playground-Reproduktion und vergleiche die Fälle mixinWithAbstractClass und mixinWithInterface. Konzentriere dich dabei darauf, wie der Compiler den Typ von super bestimmt. Verfolge den Type-Checking-Pfad für abstrakte Methoden in einer generischen Klasse, die _base erweitert; abgeschlossen ist die Aufgabe, wenn der Abstract-Class-Mixin super.getName() akzeptiert, ohne den Interface-Fall zu beeinträchtigen, und ein Regressionstest für die Reproduktion vorhanden ist.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Bewertung
- Tech-Stack
- typescript
- Bereich
- compilers
- Issue-Typ
- Bug
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Aktivitätsstatus
- Veraltet
- Klarheit
- Klar beschrieben
- Anfängerfreundlichkeit
- 35/100