I am working on a typescript project with Visual Studio Code including multiple npm packages structured like this:
/src/index.ts
/dist/...
When I right click on imported objects and choose "Go to Definition" or click F12
or by clicking on the object with holding down CTRL
, Visual Studio Code opens the corresponding .d.ts
file in /dist
However, I want VSCode to open the corresponding .ts
file in /src
Is it possible to change this behavior, as it is really annoying to manually search for the source file.
I've created git repo, so that you can try it yourself: https://github.com/flolude/stackoverflow-typescript-go-to-definition
yarn bootstrap
in order to replicate the issue.File Scope: In this mode, TypeScript files opened in Visual Studio Code are treated as independent units. As long as a file a.ts doesn't reference a file b.ts explicitly (either using /// reference directives or external modules), there is no common project context between the two files.
Code navigation lets you quickly navigate TypeScript projects. Go to Definition F12 - Go to the source code of a symbol definition. Peek Definition Alt+F12 - Bring up a Peek window that shows the definition of a symbol. Go to References Shift+F12 - Show all references to a symbol.
Installing TypeScript Definition Files for Modules and Packages a. Find the .d.ts file for a library by name in the Typings registry. Note: run the commands below from the root of your project. b. The command to run depends on the type of package. To learn more, visit the Typings README.md. The “ — save” flag will add a file to typings.json. 4.
To summarize: VS Code's JavaScript and TypeScript support is powered by TypeScript behind the scenes. To understand the APIs of external modules, TypeScript uses d.ts files for performance and scalability reasons. This way it does not have to try to load or parse all of the module's code itself.
TypeScript 2.9 introduced a compilerOption called declarationMap. Per the release notes:
Enabling --declarationMap alongside --declaration causes the compiler to emit .d.ts.map files alongside the output .d.ts files. Language Services can also now understand these map files, and uses them to map declaration-file based definition locations to their original source, when available.
In other words, hitting go-to-definition on a declaration from a .d.ts file generated with --declarationMap will take you to the source file (.ts) location where that declaration was defined, and not to the .d.ts.
I submitted a PR on your example repo to enable this setting.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With