diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 4f144f3ff9b..1a50ef2d7c0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -16852,9 +16852,10 @@ namespace ts { // in a JS file // Note:JS inferred classes might come from a variable declaration instead of a function declaration. // In this case, using getResolvedSymbol directly is required to avoid losing the members from the declaration. - const funcSymbol = node.expression.kind === SyntaxKind.Identifier ? - getResolvedSymbol(node.expression as Identifier) : - checkExpression(node.expression).symbol; + let funcSymbol = checkExpression(node.expression).symbol; + if (!funcSymbol && node.expression.kind === SyntaxKind.Identifier) { + funcSymbol = getResolvedSymbol(node.expression as Identifier); + } const type = funcSymbol && getJavaScriptClassType(funcSymbol); if (type) { return type; diff --git a/tests/cases/fourslash/indirectClassInstantiation.ts b/tests/cases/fourslash/indirectClassInstantiation.ts new file mode 100644 index 00000000000..c4d0d38d6ed --- /dev/null +++ b/tests/cases/fourslash/indirectClassInstantiation.ts @@ -0,0 +1,21 @@ +/// + +// @allowJs: true +// @Filename: something.js +//// function TestObj(){ +//// this.property = "value"; +//// } +//// var constructor = TestObj; +//// var instance = new constructor(); +//// instance./*a*/ +//// var class2 = function() { }; +//// class2.prototype.blah = function() { }; +//// var inst2 = new class2(); +//// inst2.blah/*b*/; + +goTo.marker('a'); +verify.completionListContains('property'); +edit.backspace(); + +goTo.marker('b'); +verify.quickInfoIs('(property) class2.blah: () => void');