diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 40cac0a916d41..866588c51b993 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -171,13 +171,15 @@ namespace ts.GoToDefinition { if (!baseDeclaration) return; const baseTypeNode = getEffectiveBaseTypeNode(baseDeclaration); - const baseType = baseTypeNode ? typeChecker.getTypeAtLocation(baseTypeNode) : undefined; - if (!baseType) return; + if (!baseTypeNode) return; + const expression = skipParentheses(baseTypeNode.expression); + const base = isClassExpression(expression) ? expression.symbol : typeChecker.getSymbolAtLocation(expression); + if (!base) return; const name = unescapeLeadingUnderscores(getTextOfPropertyName(classElement.name)); const symbol = hasStaticModifier(classElement) - ? typeChecker.getPropertyOfType(typeChecker.getTypeOfSymbolAtLocation(baseType.symbol, baseDeclaration), name) - : typeChecker.getPropertyOfType(baseType, name); + ? typeChecker.getPropertyOfType(typeChecker.getTypeOfSymbol(base), name) + : typeChecker.getPropertyOfType(typeChecker.getDeclaredTypeOfSymbol(base), name); if (!symbol) return; return getDefinitionFromSymbol(typeChecker, symbol, node); diff --git a/tests/cases/fourslash/goToDefinitionOverriddenMember16.ts b/tests/cases/fourslash/goToDefinitionOverriddenMember16.ts new file mode 100644 index 0000000000000..96f1467a344c6 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionOverriddenMember16.ts @@ -0,0 +1,16 @@ +/// +// @Filename: goToDefinitionOverrideJsdoc.ts +// @allowJs: true +// @checkJs: true + +//// export class C extends CompletelyUndefined { +//// /** +//// * @override/*1*/ +//// * @returns {{}} +//// */ +//// static foo() { +//// return {} +//// } +//// } + +verify.goToDefinition(['1'], [])