microsoft / microsoft/TypeScript
Type narrowing of `super` when using `this`
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
Bug Report
🔎 Search Terms
super, this, class
🕗 Version & Regression Information
Nightly
⏯ Playground Link
💻 Code
class Animal<T> {
eat<T>(this: Animal<T>) {
throw new Error('This doesnt matter');
}
}
class Dog<T> extends Animal<T> {
eat<U>(this: Dog<U>) {
super.eat(); // The type is Animal<T>.eat<T>(this: Animal<T>): void
// The type should be Animal<U>.eat<U>(this: Animal<U>): void
}
}
🙁 Actual behavior
super.eat() is typed as Animal<T>.eat<T>(this: Animal<T>): void
🙂 Expected behavior
super.eat() should be typed as Animal<U>.eat<U>(this: Animal<U>): void since this is declared as Dog<U> which is a subclass of Animal<U>.
One can workaround this by writing super.eat<U>(), but the signature then becomes goofy (it becomes Animal<T>.eat<U>(this: Animal<U>): void)
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 dem verlinkten TypeScript Playground und reproduziere den Unterschied zwischen den aktuellen und den erwarteten Typen für super.eat() in den generischen Klassen Animal und Dog. Verfolge die Verarbeitung von this-Typen beim Zugriff auf super-Eigenschaften durch den Compiler, füge anschließend einen Regressionstest hinzu und bestätige, dass super.eat() den U-spezifischen Typ beibehält, ohne ein explizites Typargument zu erfordern.
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
- 38/100