diff --git a/internal/checker/checker.go b/internal/checker/checker.go index 58981001bea..64e9f79f694 100644 --- a/internal/checker/checker.go +++ b/internal/checker/checker.go @@ -11368,21 +11368,13 @@ func (c *Checker) isOptionalPropertyDeclaration(node *ast.Node) bool { } func (c *Checker) isPropertyDeclaredInAncestorClass(prop *ast.Symbol) bool { - if prop.Parent.Flags&ast.SymbolFlagsClass == 0 { - return false - } - classType := c.getDeclaredTypeOfSymbol(prop.Parent) - for { - baseTypes := c.getBaseTypes(classType) - if len(baseTypes) == 0 { - return false - } - classType = baseTypes[0] - superProperty := c.getPropertyOfType(classType, prop.Name) - if superProperty != nil && superProperty.ValueDeclaration != nil { - return true + if prop.Parent.Flags&ast.SymbolFlagsClass != 0 { + if baseTypes := c.getBaseTypes(c.getDeclaredTypeOfSymbol(prop.Parent)); len(baseTypes) != 0 { + superProperty := c.getPropertyOfType(baseTypes[0], prop.Name) + return superProperty != nil && superProperty.ValueDeclaration != nil } } + return false } /** diff --git a/testdata/baselines/reference/compiler/checkInheritedProperty.errors.txt b/testdata/baselines/reference/compiler/checkInheritedProperty.errors.txt new file mode 100644 index 00000000000..86c262303dd --- /dev/null +++ b/testdata/baselines/reference/compiler/checkInheritedProperty.errors.txt @@ -0,0 +1,17 @@ +checkInheritedProperty.ts(7,14): error TS2729: Property 'b' is used before its initialization. + + +==== checkInheritedProperty.ts (1 errors) ==== + class Base { + } + + declare const BaseFactory: new() => Base & { c: string } + + class Derived extends BaseFactory { + a = this.b + ~ +!!! error TS2729: Property 'b' is used before its initialization. +!!! related TS2728 checkInheritedProperty.ts:8:5: 'b' is declared here. + b = "abc" + } + \ No newline at end of file diff --git a/testdata/baselines/reference/compiler/checkInheritedProperty.symbols b/testdata/baselines/reference/compiler/checkInheritedProperty.symbols new file mode 100644 index 00000000000..c977d078ae2 --- /dev/null +++ b/testdata/baselines/reference/compiler/checkInheritedProperty.symbols @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/checkInheritedProperty.ts] //// + +=== checkInheritedProperty.ts === +class Base { +>Base : Symbol(Base, Decl(checkInheritedProperty.ts, 0, 0)) +} + +declare const BaseFactory: new() => Base & { c: string } +>BaseFactory : Symbol(BaseFactory, Decl(checkInheritedProperty.ts, 3, 13)) +>Base : Symbol(Base, Decl(checkInheritedProperty.ts, 0, 0)) +>c : Symbol(c, Decl(checkInheritedProperty.ts, 3, 44)) + +class Derived extends BaseFactory { +>Derived : Symbol(Derived, Decl(checkInheritedProperty.ts, 3, 56)) +>BaseFactory : Symbol(BaseFactory, Decl(checkInheritedProperty.ts, 3, 13)) + + a = this.b +>a : Symbol(Derived.a, Decl(checkInheritedProperty.ts, 5, 35)) +>this.b : Symbol(Derived.b, Decl(checkInheritedProperty.ts, 6, 14)) +>this : Symbol(Derived, Decl(checkInheritedProperty.ts, 3, 56)) +>b : Symbol(Derived.b, Decl(checkInheritedProperty.ts, 6, 14)) + + b = "abc" +>b : Symbol(Derived.b, Decl(checkInheritedProperty.ts, 6, 14)) +} + diff --git a/testdata/baselines/reference/compiler/checkInheritedProperty.types b/testdata/baselines/reference/compiler/checkInheritedProperty.types new file mode 100644 index 00000000000..086a9df10ed --- /dev/null +++ b/testdata/baselines/reference/compiler/checkInheritedProperty.types @@ -0,0 +1,26 @@ +//// [tests/cases/compiler/checkInheritedProperty.ts] //// + +=== checkInheritedProperty.ts === +class Base { +>Base : Base +} + +declare const BaseFactory: new() => Base & { c: string } +>BaseFactory : new () => Base & { c: string; } +>c : string + +class Derived extends BaseFactory { +>Derived : Derived +>BaseFactory : Base & { c: string; } + + a = this.b +>a : string +>this.b : string +>this : this +>b : string + + b = "abc" +>b : string +>"abc" : "abc" +} + diff --git a/testdata/tests/cases/compiler/checkInheritedProperty.ts b/testdata/tests/cases/compiler/checkInheritedProperty.ts new file mode 100644 index 00000000000..12960b990c5 --- /dev/null +++ b/testdata/tests/cases/compiler/checkInheritedProperty.ts @@ -0,0 +1,12 @@ +// @strict: true +// @noEmit: true + +class Base { +} + +declare const BaseFactory: new() => Base & { c: string } + +class Derived extends BaseFactory { + a = this.b + b = "abc" +}