Angular 中的 Typescript 编译器

Typescript compiler in Angular

我想知道,如果有一些选项,如何从 TSC 命令中排除 node_modules 包。

我正在使用 Typescript v3.5.3。我的 tsconfig.json 是

{
  "compilerOptions": {
    "outDir": "build/dist",
    "module": "esnext",
    "target": "es5",
    "lib": ["es2018", "dom"],
    "sourceMap": true,
    "allowJs": true,
    "jsx": "preserve",
    "moduleResolution": "node",
    "rootDir": "src",
    "forceConsistentCasingInFileNames": true,
    "noImplicitReturns": true,
    "noImplicitThis": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "suppressImplicitAnyIndexErrors": true,
    "skipLibCheck": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "strict": false,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true,
    "typeRoots": ["node_modules/@types"]
  },
  "exclude": [
    "build",
    "config",
    "node_modules"
  ],
  "include": [
    "src"
  ]
}

还有一个 angular 这样的脚本

import { Component } from "@angular/core";

@Component({
  selector: "app-home",
  styleUrls: ["./home.component.less"],
  templateUrl: "./home.component.html"
})
export class HomeComponent {
  title = "angular home";
  
  constructor(){
    this.log(123);
    this.log('hello world');
  }

  log(someArg) {
    console.log(someArg);
  }
}

现在,如果我 运行 TSC,我预计会出现错误,因为函数 log 是隐含的任何类型。在这种情况下一切正常!但如果我将使用此代码

import { Node } from "@alfresco/js-api";
import { Component } from "@angular/core";

@Component({
  selector: "app-home",
  styleUrls: ["./home.component.less"],
  templateUrl: "./home.component.html"
})
export class HomeComponent {
  title = "angular home";
  selectedNode: Node;
  
  constructor(){
    this.log(123);
    this.log('hello world');
  }

  log(someArg) {
    console.log(someArg);
  }

}

我会从 node_modules 的包中得到错误,比如

node_modules/@alfresco/js-api/src/authentication/processAuth.ts:181:9 - error TS2322: Type 'null' is not assignable to type 'string | undefined'.

181 this.authentications.basicAuth.username = null; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我知道为什么,因为 "noImplicitAny" 设置为 true,但我想要的是忽略 node_modules 包!因此在 Angular 中从 tsconfig 中排除选项没有任何意义。我认为,构建是包 @alfresco/js-api 包含在脚本中并作为一个检查。

有趣的是,如果我将在 React.js 中使用类似的代码,一切都如我所料。当我使用带有 "noImplicitAny" = true 的命令 "TSC" 并且 node_modules 包将被忽略时,是否有一些选项或其他东西?非常感谢!

使用 import 引用的文件必须由 tsc命令。排除是为了方便,而运行 tsc命令排除要导入(或使用)的文件中未导入(或使用)的文件被编译。

默认情况下,tsc命令忽略node_modules,这就是为什么当 @alfresco/js-api 没有导入时没有错误,当它被包含时 TSC 将解决它们并在这些文件上暗示 compilerOptions

参考tsconfig.json document

Any files that are referenced by files included via the "files" or "include" properties are also included. Similarly, if a file B.ts is referenced by another file A.ts, then B.ts cannot be excluded unless the referencing file A.ts is also specified in the "exclude" list.

所以这完全取决于错误和导入的模块,而不是 typescript 编译器。

请阅读此问题线程了解更多详情,https://github.com/microsoft/TypeScript/issues/7432

因此,要解决此问题,请使用其他模块或关闭 Implicits 的编译器选项。