diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 3501c88b95fcd..5bc5a868fa464 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -26861,7 +26861,7 @@ namespace ts { if (isInPropertyInitializer(node) && !(isAccessExpression(node) && isAccessExpression(node.expression)) && !isBlockScopedNameDeclaredBeforeUse(valueDeclaration, right) - && !isPropertyDeclaredInAncestorClass(prop)) { + && (compilerOptions.useDefineForClassFields || !isPropertyDeclaredInAncestorClass(prop))) { diagnosticMessage = error(right, Diagnostics.Property_0_is_used_before_its_initialization, declarationName); } else if (valueDeclaration.kind === SyntaxKind.ClassDeclaration && diff --git a/tests/baselines/reference/redeclaredProperty.errors.txt b/tests/baselines/reference/redeclaredProperty.errors.txt new file mode 100644 index 0000000000000..331e5610f8df1 --- /dev/null +++ b/tests/baselines/reference/redeclaredProperty.errors.txt @@ -0,0 +1,21 @@ +tests/cases/conformance/classes/propertyMemberDeclarations/redeclaredProperty.ts(7,12): error TS2729: Property 'b' is used before its initialization. + + +==== tests/cases/conformance/classes/propertyMemberDeclarations/redeclaredProperty.ts (1 errors) ==== + class Base { + b = 1; + } + + class Derived extends Base { + b; + d = this.b; + ~ +!!! error TS2729: Property 'b' is used before its initialization. +!!! related TS2728 tests/cases/conformance/classes/propertyMemberDeclarations/redeclaredProperty.ts:6:3: 'b' is declared here. + + constructor() { + super(); + this.b = 2; + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/redeclaredProperty.js b/tests/baselines/reference/redeclaredProperty.js new file mode 100644 index 0000000000000..20af007d62e34 --- /dev/null +++ b/tests/baselines/reference/redeclaredProperty.js @@ -0,0 +1,28 @@ +//// [redeclaredProperty.ts] +class Base { + b = 1; +} + +class Derived extends Base { + b; + d = this.b; + + constructor() { + super(); + this.b = 2; + } +} + + +//// [redeclaredProperty.js] +class Base { + b = 1; +} +class Derived extends Base { + b; + d = this.b; + constructor() { + super(); + this.b = 2; + } +} diff --git a/tests/baselines/reference/redefinedPararameterProperty.errors.txt b/tests/baselines/reference/redefinedPararameterProperty.errors.txt new file mode 100644 index 0000000000000..65763261152c0 --- /dev/null +++ b/tests/baselines/reference/redefinedPararameterProperty.errors.txt @@ -0,0 +1,19 @@ +tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts(6,14): error TS2729: Property 'a' is used before its initialization. + + +==== tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts (1 errors) ==== + class Base { + a = 1; + } + + class Derived extends Base { + b = this.a /*undefined*/; + ~ +!!! error TS2729: Property 'a' is used before its initialization. +!!! related TS2728 tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts:8:17: 'a' is declared here. + + constructor(public a: number) { + super(); + } + } + \ No newline at end of file diff --git a/tests/baselines/reference/redefinedPararameterProperty.js b/tests/baselines/reference/redefinedPararameterProperty.js new file mode 100644 index 0000000000000..8ad9b5facc076 --- /dev/null +++ b/tests/baselines/reference/redefinedPararameterProperty.js @@ -0,0 +1,26 @@ +//// [redefinedPararameterProperty.ts] +class Base { + a = 1; + } + + class Derived extends Base { + b = this.a /*undefined*/; + + constructor(public a: number) { + super(); + } + } + + +//// [redefinedPararameterProperty.js] +class Base { + a = 1; +} +class Derived extends Base { + a; + b = this.a /*undefined*/; + constructor(a) { + super(); + this.a = a; + } +} diff --git a/tests/baselines/reference/redefinedPararameterProperty.symbols b/tests/baselines/reference/redefinedPararameterProperty.symbols new file mode 100644 index 0000000000000..5e05041f5390c --- /dev/null +++ b/tests/baselines/reference/redefinedPararameterProperty.symbols @@ -0,0 +1,3 @@ +=== tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts === + +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/redefinedPararameterProperty.types b/tests/baselines/reference/redefinedPararameterProperty.types new file mode 100644 index 0000000000000..5e05041f5390c --- /dev/null +++ b/tests/baselines/reference/redefinedPararameterProperty.types @@ -0,0 +1,3 @@ +=== tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts === + +No type information for this code. \ No newline at end of file diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/redeclaredProperty.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/redeclaredProperty.ts new file mode 100644 index 0000000000000..4080146e028d2 --- /dev/null +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/redeclaredProperty.ts @@ -0,0 +1,17 @@ +// @noTypesAndSymbols: true +// @strictNullChecks: true +// @target: esnext +// @useDefineForClassFields: true +class Base { + b = 1; +} + +class Derived extends Base { + b; + d = this.b; + + constructor() { + super(); + this.b = 2; + } +} diff --git a/tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts b/tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts new file mode 100644 index 0000000000000..02eabfbfcfabd --- /dev/null +++ b/tests/cases/conformance/classes/propertyMemberDeclarations/redefinedPararameterProperty.ts @@ -0,0 +1,16 @@ +// @noTypesAndSymbols: true +// @strictNullChecks: true +// @target: esnext +// @useDefineForClassFields: true +class Base { + a = 1; + } + + class Derived extends Base { + b = this.a /*undefined*/; + + constructor(public a: number) { + super(); + } + } + \ No newline at end of file