diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 5a3ddf87d35..94c2af92cdd 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -2009,6 +2009,9 @@ namespace ts { if (currentFlow && isNarrowableReference(node)) { node.flowNode = currentFlow; } + if (isSpecialPropertyDeclaration(node as PropertyAccessExpression)) { + bindThisPropertyAssignment(node as PropertyAccessExpression); + } break; case SyntaxKind.BinaryExpression: const specialKind = getSpecialPropertyAssignmentKind(node as BinaryExpression); @@ -2317,7 +2320,7 @@ namespace ts { declareSymbol(file.symbol.exports, file.symbol, node, SymbolFlags.Property | SymbolFlags.ExportValue | SymbolFlags.ValueModule, SymbolFlags.None); } - function bindThisPropertyAssignment(node: BinaryExpression) { + function bindThisPropertyAssignment(node: BinaryExpression | PropertyAccessExpression) { Debug.assert(isInJavaScriptFile(node)); const container = getThisContainer(node, /*includeArrowFunctions*/ false); switch (container.kind) { diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index ac096174abe..f308403541a 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1508,6 +1508,12 @@ namespace ts { return SpecialPropertyAssignmentKind.None; } + export function isSpecialPropertyDeclaration(expr: ts.PropertyAccessExpression): boolean { + return isInJavaScriptFile(expr) && + expr.parent && expr.parent.kind === SyntaxKind.ExpressionStatement && + !!getJSDocTypeTag(expr.parent); + } + export function getExternalModuleName(node: Node): Expression { if (node.kind === SyntaxKind.ImportDeclaration) { return (node).moduleSpecifier;