Microsoft/TypeScript

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

Open

#57,263 opened on Feb 1, 2024

View on GitHub
 (0 comments) (1 reaction) (0 assignees)TypeScript (6,726 forks)batch import
BugDomain: classesHelp Wanted

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (Avg merge 6d 17h) (9 merged PRs in 30d)

Description

🔎 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

Contributor guide