microsoft / microsoft/TypeScript

Subclass of a (non-abstract class that uses declaration merging to implement parent abstract member) also has to implement same abstract member

Offen
#57,263 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bug Domain: classes Help Wanted
Vorherrschende Sprache
Go
Sterne
111k
Forks
14.4k
Ø Merge
1 T. 19 Std.
Gemergte PRs (30 T.)
117

Beschreibung

🔎 Search Terms

subclass inherit abstract concrete method property member complains parent declaration merge merging satisfy implement

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed all the FAQ entries
⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.3.3#code/JYOwLgpgTgZghgYwgAgApyhcBJZBvAKGWORgHsyAKASgC5kA3M4AEwIF8C4AjAZzCiIwyBABs4vXmgxZhhEsh79BCYeSp1GzNpwIB6PcgCyrFqJTAAtgAdzl2VPSZwjYHGQsIYjHDDAyIMj2UADmEAQE3pLGpubIEAAekCAsjjIueJygkLCIKCYsZiiJyanSzmC4mRFRUgDCABbAoizxSVhlBUX47MgGHmQQvCAA5MIA7mRQANYR-V1xVrYQ9uBpFR7AmKqiAJ6R4tELEABMbaXrsvhEJOo0PRw1h-VNLWclHVLHZ5l9hpMzXhAA

💻 Code
interface ParentI {
    foo(): void
}
abstract class Parent {
    abstract foo(): void
}

// Middle implements Parent via declaration merge

class Middle extends Parent {}
interface Middle extends ParentI {}

class Child extends Middle {} // doesn't work

// Middle implements Parent directly
class Middle2 extends Parent {
    foo() {}
}

class Child2 extends Middle2 {} // works
🙁 Actual behavior

Typescript complains that Child must implement an foo, even though Middle has already implemented foo via declaration merging.

🙂 Expected behavior

I would expect Child to pass type-checking, just as Child2 does. Seeing as how Middle (a concrete class) is type-safe and Child extends Middle with no further modification, this feels very surprising.

Additional information about the issue

No response

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit der bereitgestellten TypeScript Playground-Reproduktion und vergleiche das Beispiel zur Deklarationszusammenführung mit dem direkt implementierten Middle2-Fall. Verfolge, wie der Compiler abstrakte Member über zusammengeführte Klassen- und Schnittstellendeklarationen hinweg verarbeitet, und füge einen Regressionstest hinzu, der zeigt, dass Child eine Typprüfung besteht, ohne foo selbst zu implementieren.

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
Größtenteils klar
Anfängerfreundlichkeit
35/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.