Angular 角度8+;tsconfig路径别名在.spec文件中无法识别

Angular 角度8+;tsconfig路径别名在.spec文件中无法识别,angular,typescript,testing,visual-studio-code,jestjs,Angular,Typescript,Testing,Visual Studio Code,Jestjs,我正在进行一些角度测试,我的规范文件将无法识别我的路径,它们会在VS代码中给我一个红色的蠕动导入警告(并出现问题),尽管它们以其他方式工作(测试工作,等等)。我假设这是一个tsconfig问题,而不是linting问题,因为它给我的错误是:找不到模块'@feature/'.ts(2307) 它在功能上对我影响不大,但它很烦人(并阻止自动导入) tsconfig.json: { "compileOnSave": false, "compilerOptions": {

我正在进行一些角度测试,我的规范文件将无法识别我的路径,它们会在VS代码中给我一个红色的蠕动导入警告(并出现问题),尽管它们以其他方式工作(测试工作,等等)。我假设这是一个tsconfig问题,而不是linting问题,因为它给我的错误是:
找不到模块'@feature/'.ts(2307)

它在功能上对我影响不大,但它很烦人(并阻止自动导入)

tsconfig.json:

{
    "compileOnSave": false,
    "compilerOptions": {
        "module": "esnext",
        "outDir": "./dist/out-tsc",
        "strictNullChecks": true,
        "noImplicitAny": false,
        "noImplicitThis": true,
        "alwaysStrict": false,
        "forceConsistentCasingInFileNames": true,
        "noImplicitReturns": true,
        "noUnusedLocals": true,
        "skipLibCheck": true,
        "sourceMap": true,
        "declaration": false,
        "moduleResolution": "node",
        "emitDecoratorMetadata": true,
        "experimentalDecorators": true,
        "allowJs": true,
        "resolveJsonModule": true,
        "esModuleInterop": true,
        "target": "es2015",
        "types": [
            "node",
            "arcgis-js-api",
            "jest"
        ],
        "typeRoots": [
            "node_modules/@types"
        ],
        "lib": [
            "es2017",
            "dom",
            "esnext.asynciterable"
        ],
        "baseUrl": ".",
        "paths": {
            "core-js/es6/*": [
                "node_modules/core-js/es/*"
            ],
            "core-js/es7/reflect": [
                "node_modules/core-js/proposals/reflect-metadata"
            ],
            "@core/*": [
                "src/app/core/*"
            ],
            "@shared/*": [
                "src/app/shared/*"
            ],
            "@feature/*": [
                "src/app/feature/*"
            ],
            "@test/*": [
                "src/test/*"
            ],
            "@/*": [
                "src/*"
            ]
        }
    },
    "files": [
        "src/main.ts",
        "src/polyfills.ts"
    ],
    "include": [
        "**/*.d.ts"
    ]
}
tsconfig.spec.json和tsconfig.app.json路径(注意angular cli中的标准文件夹结构):

angular.json

...
            "test": {
                "builder": "@angular-builders/jest:run",
                "options": {
                    "tsConfig": "src/tsconfig.spec.json",
                    "no-cache": true,
                    "polyfills": "src/polyfills.ts",
                    "configPath": "./jest.config.js",
                    "styles": [
                        "node_modules/font-awesome/css/font-awesome.css",
                        "src/styles.scss"
                    ],
                    "scripts": [],
                    "assets": [
                        "src/favicon.ico",
                        "src/assets",
                        "src/manifest.json",
                    ],
                    "stylePreprocessorOptions": {
                        "includePaths": [
                            "src"
                        ]
                    }
                }
            },
            "lint": {
                "builder": "@angular-devkit/build-angular:tslint",
                "options": {
                    "tsConfig": [
                        "src/tsconfig.app.json",
                        "src/tsconfig.spec.json"
                    ],
                    "exclude": [
                        "**/node_modules/**"
                    ]
                }
            }
...
版本:

Angular CLI: 8.3.6
Node: 12.3.1
OS: win32 x64
Angular: 8.2.8
... animations, common, compiler, compiler-cli, core, forms     
... language-service, platform-browser, platform-browser-dynamic
... router, service-worker

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.803.6
@angular-devkit/build-angular     0.803.6
@angular-devkit/build-optimizer   0.803.6
@angular-devkit/build-webpack     0.803.6
@angular-devkit/core              8.3.6
@angular-devkit/schematics        8.3.6
@angular/cli                      8.3.6
@angular/pwa                      0.803.6
@ngtools/webpack                  8.3.6
@schematics/angular               8.3.6
@schematics/update                0.803.6
rxjs                              6.5.3
typescript                        3.5.3
webpack                           4.39.2

我想问题与您的
文件和
包含
配置有关。当我把你有限的
文件集
包含
模式包括在内时,我立即看到了你所描述的相同问题,原因很简单,不是我所有的文件都匹配
*.d.ts

要查看这是否是导致您出现问题的原因(或者如果您知道您的文件与
*.d.ts
不匹配),我建议您只需删除
文件
包含
部分,保存
tsconfig.json
并在VS code中重新启动ts服务器即可

对于那些不知道的用户,可以通过打开命令选项板(Ctrl+Shift+p或)在VS代码中重新启动TS服务器⌘+在
.ts
文件中按住Shift+P键或仅按F1键),然后键入
重新启动ts
并选择该命令

如果这是您的解决方案,那么您只需要考虑在
文件
包含
中实际需要什么。政府应该在这方面有所帮助

最大的收获:你不需要它们中的任何一个:

如果未指定“文件”和“包含”,则编译器默认包括包含目录和子目录中的所有TypeScript(.ts、.d.ts和.tsx)文件,但使用“排除”属性排除的文件除外。如果allowJs设置为true,则还包括JS文件(.JS和.jsx)

如果您确实需要这种特殊性,您可能只需要将
*.ts
和\或
*.tsx
模式添加到
include
模式中即可解决此问题


我希望这有帮助

在我的例子中,我忘了根据我的项目设置
jest.config.js
文件

tsconfig.ts
...
"@app/*": ["src/app/*"],
...

jest.config.js
module.exports={
模块映射:{
“@app/(.*)$”:“/src/app/$1”
} 
};
参考资料:

tsconfig.ts

{
  "compilerOptions": {
    ....
    "paths": {
      "@app1/*" : ["src/*"]
    }
  }
}
packages.json

  "jest": {
    ...
    "rootDir": "src",
    "moduleNameMapper": {
      "@app1/(.*)$": "<rootDir>/$1"
    } 
  }
“开玩笑”:{
...
“rootDir”:“src”,
“moduleNameMapper”:{
“@app1/(.*)$”:“/$1”
} 
}

确保您的
tsconfig.spec.json
扩展了您提供的
路径的配置。或者将这些路径放在我上面显示的配置中,`extends:'./tsconfig.json',`我正在扩展它。此外,我还尝试直接将路径放入;这似乎没有什么区别。如果问题只与VSCode有关,尽管一切正常,但还是值得在VSCode中创建一个问题github@MapLion将您的typescript版本降级为
typescript:“3.4.5”“
@Sergey我不认为这是一个VSCode问题;我认为这是一个typescript/tsconfig问题,但我想在用比任何事情都更烦人的东西堵塞问题之前,先联系一下社区。谢谢你,先生。你让我高兴,是我第一次得到赏金。我还没有完全理解这种行为,但我真的很高兴它得到了解决。我很高兴这有帮助!Re:
文件
包含
的行为:默认情况下,所有类型脚本文件都包含在内,除非您通过命令行或
tsconfig.json
传入特定文件的列表,或通过
包含
传入要包含的模式。您还可以通过
tsconfig.json
中的
exclude
排除特定模式,这帮助我解决了自己的问题。我的路径与我在TS/JS中使用的网页包路径别名有关,这些路径需要通知Typescript系统,否则它无法找到它们。我的修复方法是为tsconfig.json文件中的每个网页包别名添加“路径”。
{
  "compilerOptions": {
    ....
    "paths": {
      "@app1/*" : ["src/*"]
    }
  }
}
  "jest": {
    ...
    "rootDir": "src",
    "moduleNameMapper": {
      "@app1/(.*)$": "<rootDir>/$1"
    } 
  }