Fix base-in-interface check
This commit is contained in:
parent
58e1746204
commit
832d51f629
|
@ -29518,8 +29518,9 @@ namespace ts {
|
|||
const derivedPropertyFlags = derived.flags & SymbolFlags.PropertyOrAccessor;
|
||||
if (basePropertyFlags && derivedPropertyFlags) {
|
||||
// property/accessor is overridden with property/accessor
|
||||
const baseParent = getParentOfSymbol(base);
|
||||
if (baseDeclarationFlags & ModifierFlags.Abstract
|
||||
|| getObjectFlags(getTargetType(baseType)) & ObjectFlags.Interface
|
||||
|| baseParent && baseParent.flags & SymbolFlags.Interface
|
||||
|| derived.valueDeclaration && isBinaryExpression(derived.valueDeclaration)) {
|
||||
// when the base property is abstract or from an interface, base/derived flags don't need to match
|
||||
// same when the derived property is from an assignment
|
||||
|
|
19
tests/baselines/reference/accessorsOverrideProperty5.js
Normal file
19
tests/baselines/reference/accessorsOverrideProperty5.js
Normal file
|
@ -0,0 +1,19 @@
|
|||
//// [accessorsOverrideProperty5.ts]
|
||||
interface I {
|
||||
p: number
|
||||
}
|
||||
interface B extends I { }
|
||||
class B { }
|
||||
class C extends B {
|
||||
get p() { return 1 }
|
||||
set p(value) { }
|
||||
}
|
||||
|
||||
|
||||
//// [accessorsOverrideProperty5.js]
|
||||
class B {
|
||||
}
|
||||
class C extends B {
|
||||
get p() { return 1; }
|
||||
set p(value) { }
|
||||
}
|
26
tests/baselines/reference/accessorsOverrideProperty5.symbols
Normal file
26
tests/baselines/reference/accessorsOverrideProperty5.symbols
Normal file
|
@ -0,0 +1,26 @@
|
|||
=== tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty5.ts ===
|
||||
interface I {
|
||||
>I : Symbol(I, Decl(accessorsOverrideProperty5.ts, 0, 0))
|
||||
|
||||
p: number
|
||||
>p : Symbol(I.p, Decl(accessorsOverrideProperty5.ts, 0, 13))
|
||||
}
|
||||
interface B extends I { }
|
||||
>B : Symbol(B, Decl(accessorsOverrideProperty5.ts, 2, 1), Decl(accessorsOverrideProperty5.ts, 3, 25))
|
||||
>I : Symbol(I, Decl(accessorsOverrideProperty5.ts, 0, 0))
|
||||
|
||||
class B { }
|
||||
>B : Symbol(B, Decl(accessorsOverrideProperty5.ts, 2, 1), Decl(accessorsOverrideProperty5.ts, 3, 25))
|
||||
|
||||
class C extends B {
|
||||
>C : Symbol(C, Decl(accessorsOverrideProperty5.ts, 4, 11))
|
||||
>B : Symbol(B, Decl(accessorsOverrideProperty5.ts, 2, 1), Decl(accessorsOverrideProperty5.ts, 3, 25))
|
||||
|
||||
get p() { return 1 }
|
||||
>p : Symbol(C.p, Decl(accessorsOverrideProperty5.ts, 5, 19), Decl(accessorsOverrideProperty5.ts, 6, 24))
|
||||
|
||||
set p(value) { }
|
||||
>p : Symbol(C.p, Decl(accessorsOverrideProperty5.ts, 5, 19), Decl(accessorsOverrideProperty5.ts, 6, 24))
|
||||
>value : Symbol(value, Decl(accessorsOverrideProperty5.ts, 7, 10))
|
||||
}
|
||||
|
22
tests/baselines/reference/accessorsOverrideProperty5.types
Normal file
22
tests/baselines/reference/accessorsOverrideProperty5.types
Normal file
|
@ -0,0 +1,22 @@
|
|||
=== tests/cases/conformance/classes/propertyMemberDeclarations/accessorsOverrideProperty5.ts ===
|
||||
interface I {
|
||||
p: number
|
||||
>p : number
|
||||
}
|
||||
interface B extends I { }
|
||||
class B { }
|
||||
>B : B
|
||||
|
||||
class C extends B {
|
||||
>C : C
|
||||
>B : B
|
||||
|
||||
get p() { return 1 }
|
||||
>p : number
|
||||
>1 : 1
|
||||
|
||||
set p(value) { }
|
||||
>p : number
|
||||
>value : number
|
||||
}
|
||||
|
|
@ -0,0 +1,10 @@
|
|||
// @target: esnext
|
||||
interface I {
|
||||
p: number
|
||||
}
|
||||
interface B extends I { }
|
||||
class B { }
|
||||
class C extends B {
|
||||
get p() { return 1 }
|
||||
set p(value) { }
|
||||
}
|
Loading…
Reference in a new issue