Visual Studio Code can't resolve angular's tsconfig paths

 ̄綄美尐妖づ 提交于 2019-12-19 07:42:23

问题


I'm trying to import some services using barrels and tsconfigs paths options but I can't get angular and vscode to get along.

If it works for one it doesn't for the other and viceversa...

My situation seems to be pretty simple:

  • in src/app/services I have a service which is exported in a index.ts
  • my src/tsconfig.app.json is just this:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": [],
    "baseUrl": ".",
    "paths": {
      "services": ["app/services"]
    }
  },
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ],
}

and my angular app compiles with no issues, but vscode keep giving me errors every time I try to import my service from 'services' giving me [ts] Cannot find module 'services'.

why?

I'm using typescript 3.1.6 and in vscode settings I have "typescript.tsdk": "C:/Users/myuser/AppData/Roaming/npm/node_modules/typescript/lib" (I also tried to leave the default setting, no changes)


edit:

if I specify paths in ./tsconfig.json starting from src, vscode is happy but angular is not.

if I specify paths in both tsconfig.json and src/tsconfig.app.json, both vscode and angular are happy, but it seems a too stupid workaround to me...


回答1:


I figured it out, even if I'm keep thinking that is all absurd...

VsCode automatically looks for a tsconfig.json file and it doesn't care about tsconfig.app.json, so paths needs to be specified in tsconfig.json.

At the same time, the angular-cli scaffolding specify a baseUrl parameter in tsconfig.app.json which overrides the upper one.

The solution is to delete baseUrl parameter in the tsconfig.app.json or edit its value to "../"

(As a personal remark, given that vscode is largely used to build angular solutions, I think that there's something that should be revisited in the angular-cli scaffolding or in how vscode looks for tsconfig files)




回答2:


It seems VSCode only checks the tsconfig.json directly in the folder your open. It does not check folders above like tsc and does not look at tsconfig.app.json. So in some cases the baseUrl might be missing because VSCode simply has not read a tsconfig.json.

VSCode's limitation to a single tsconfig.json in a fixed place has been around for a while and it seems it's not so easy to make this more flexible: https://github.com/microsoft/vscode/issues/12463 (scroll to end)

As mentioned above this is annoying in Angular-CLI scaffolding with multiple sub-projects where there is only one tsconfig.json at the root of the workspace. Obviously the projects might have different baseUrls in their tsconfig.app.json which cannot all go in a single tsconfig.json at the root.

As a workaround I have in addition to the project specific baseUrl in tsconfig.app.json created an extra minimal tsconfig.json for VSCode in the src folder of a sub-project with "baseUrl":"." and open VSCode from there. I have not tested this severely but so far Angular compiling and VSCode intellisense both seem to be happy.




回答3:


I encountered a similar situation with Visual Code and Angular 7

ORIGINAL CODE (valid path, from a book example):

import { Stock } from 'app/model/stock';

ERROR:

Failed to compile.
./src/app/app.component.ts Module not found: Error: Can't resolve 'app/model/stock'...

"CORRECTED" CODE:

import { Stock } from './model/stock';



回答4:


In case you work with project Angular, let place baseUrl and paths in tsconfig.json instead of tsconfig.app.json.



来源:https://stackoverflow.com/questions/53173306/visual-studio-code-cant-resolve-angulars-tsconfig-paths

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!