diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts
index af03eb260f5..9ae8dda40f8 100644
--- a/src/services/goToDefinition.ts
+++ b/src/services/goToDefinition.ts
@@ -198,14 +198,17 @@ namespace ts.GoToDefinition {
return undefined;
}
- const symbol = typeChecker.getSymbolAtLocation(node);
+ const symbol = getSymbol(node, typeChecker);
if (!symbol) return undefined;
const typeAtLocation = typeChecker.getTypeOfSymbolAtLocation(symbol, node);
const returnType = tryGetReturnTypeOfFunction(symbol, typeAtLocation, typeChecker);
const fromReturnType = returnType && definitionFromType(returnType, typeChecker, node);
// If a function returns 'void' or some other type with no definition, just return the function definition.
- return fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node);
+ const typeDefinitions = fromReturnType && fromReturnType.length !== 0 ? fromReturnType : definitionFromType(typeAtLocation, typeChecker, node);
+ return typeDefinitions.length ? typeDefinitions
+ : !(symbol.flags & SymbolFlags.Value) && symbol.flags & SymbolFlags.Type ? getDefinitionFromSymbol(typeChecker, skipAlias(symbol, typeChecker), node)
+ : undefined;
}
function definitionFromType(type: Type, checker: TypeChecker, node: Node): readonly DefinitionInfo[] {
diff --git a/tests/cases/fourslash/goToTypeDefinition3.ts b/tests/cases/fourslash/goToTypeDefinition3.ts
new file mode 100644
index 00000000000..861796e0a34
--- /dev/null
+++ b/tests/cases/fourslash/goToTypeDefinition3.ts
@@ -0,0 +1,6 @@
+///
+
+////type /*definition*/T = string;
+////const x: /*reference*/T;
+
+verify.goToType("reference", "definition");
diff --git a/tests/cases/fourslash/goToTypeDefinition4.ts b/tests/cases/fourslash/goToTypeDefinition4.ts
new file mode 100644
index 00000000000..7c00b132f89
--- /dev/null
+++ b/tests/cases/fourslash/goToTypeDefinition4.ts
@@ -0,0 +1,12 @@
+///
+
+// @Filename: foo.ts
+////export type /*def0*/T = string;
+////export const /*def1*/T = "";
+
+// @Filename: bar.ts
+////import { T } from "./foo";
+////let x: [|/*reference*/T|];
+
+verify.goToType("reference", []);
+verify.goToDefinition("reference", ["def0", "def1"]);
diff --git a/tests/cases/fourslash/goToTypeDefinition5.ts b/tests/cases/fourslash/goToTypeDefinition5.ts
new file mode 100644
index 00000000000..8750a6697bf
--- /dev/null
+++ b/tests/cases/fourslash/goToTypeDefinition5.ts
@@ -0,0 +1,10 @@
+///
+
+// @Filename: foo.ts
+////let Foo: /*definition*/unresolved;
+////type Foo = { x: string };
+
+/////*reference*/Foo;
+
+
+verify.goToType("reference", []);