mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-06 02:33:53 -06:00
In isInPropertyInitializer, don't bail out at a PropertyAssignment (#18449)
This commit is contained in:
parent
be5c00f4c9
commit
cf53743bd6
@ -14753,7 +14753,7 @@ namespace ts {
|
||||
return;
|
||||
}
|
||||
|
||||
if (findAncestor(node, node => node.kind === SyntaxKind.PropertyDeclaration ? true : isExpression(node) ? false : "quit") &&
|
||||
if (isInPropertyInitializer(node) &&
|
||||
!isBlockScopedNameDeclaredBeforeUse(valueDeclaration, right)
|
||||
&& !isPropertyDeclaredInAncestorClass(prop)) {
|
||||
error(right, Diagnostics.Block_scoped_variable_0_used_before_its_declaration, unescapeLeadingUnderscores(right.escapedText));
|
||||
@ -14766,6 +14766,20 @@ namespace ts {
|
||||
}
|
||||
}
|
||||
|
||||
function isInPropertyInitializer(node: Node): boolean {
|
||||
return !!findAncestor(node, node => {
|
||||
switch (node.kind) {
|
||||
case SyntaxKind.PropertyDeclaration:
|
||||
return true;
|
||||
case SyntaxKind.PropertyAssignment:
|
||||
// We might be in `a = { b: this.b }`, so keep looking. See `tests/cases/compiler/useBeforeDeclaration_propertyAssignment.ts`.
|
||||
return false;
|
||||
default:
|
||||
return isPartOfExpression(node) ? false : "quit";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* It's possible that "prop.valueDeclaration" is a local declaration, but the property was also declared in a superclass.
|
||||
* In that case we won't consider it used before its declaration, because it gets its value from the superclass' declaration.
|
||||
|
||||
@ -0,0 +1,11 @@
|
||||
tests/cases/compiler/useBeforeDeclaration_propertyAssignment.ts(2,27): error TS2448: Block-scoped variable 'b' used before its declaration.
|
||||
|
||||
|
||||
==== tests/cases/compiler/useBeforeDeclaration_propertyAssignment.ts (1 errors) ====
|
||||
export class C {
|
||||
public a = { b: this.b };
|
||||
~
|
||||
!!! error TS2448: Block-scoped variable 'b' used before its declaration.
|
||||
private b = 0;
|
||||
}
|
||||
|
||||
@ -0,0 +1,18 @@
|
||||
//// [useBeforeDeclaration_propertyAssignment.ts]
|
||||
export class C {
|
||||
public a = { b: this.b };
|
||||
private b = 0;
|
||||
}
|
||||
|
||||
|
||||
//// [useBeforeDeclaration_propertyAssignment.js]
|
||||
"use strict";
|
||||
exports.__esModule = true;
|
||||
var C = /** @class */ (function () {
|
||||
function C() {
|
||||
this.a = { b: this.b };
|
||||
this.b = 0;
|
||||
}
|
||||
return C;
|
||||
}());
|
||||
exports.C = C;
|
||||
@ -0,0 +1,4 @@
|
||||
export class C {
|
||||
public a = { b: this.b };
|
||||
private b = 0;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user