Angular 9 Ivy 构建 - 扩展错误

Angular 9 Ivy build - extension errors

早上好!

我最近将一个 v8 项目更新为 v9,它似乎运行良好。但是,我有一些扩展,编译器会抛出一些关于它们的错误,而在我最近升级的另一个项目中却没有。

扩展是基本类型,用于构造函数和原型。它们设置得很好——相同的设置在我拥有它们的多个项目中都有效。至关重要的是,它们在其他升级的项目中工作正常,没有任何错误。

但是,要获得所有基本用法确认:

将 iface 添加到 typings.d.ts,例如

interface StringConstructor {
  isNullOrEmpty(str: string): boolean;
}  
interface String {
  padStartWithChar(char: string, totalSize: number): string;
}

实施,例如

export {};

String.isNullOrEmpty = function(str: string): boolean {
  // ...
};

String.prototype.padStartWithChar = function(this: string, char: string, totalSize: number): string {
  // ...
}

并在 main.ts

中导入
// ...
import './extensions/string-extensions';
// ...

我的路径没有改变,它们都指向所有正确位置的所有正确文件,我可以考虑检查它们(src/typings.d.ts 在我放置它的 src 中,tsconfig.app.ts 像以前一样包含它,等等)。

这会导致构建错误;我收到了所有扩展的垃圾邮件错误,构建最终停止:

...

src/extensions/string-extensions.ts:9:8 - error TS2339: Property 'isNullOrEmpty' does not exist on type 'StringConstructor'.

9 String.isNullOrEmpty = function(str: string): boolean {

...

** Angular Live Development Server is listening on localhost:4200, open your browser on http://localhost:4200/ **

并尝试浏览 Cannot GET/ 基本消息中的结果。但是,它会在保存文件时进行通常的重新构建,其中会再次显示所有这些错误消息,但这次无论如何都会完成构建并正常工作。

有没有人能指出我可能错过的方向?在这两个项目之间,我检查了 angular.jsontsconfigs、main.ts 等之间的任何重大变化,但到目前为止,我一无所获。

谢谢。

编辑:

恢复并再次尝试升级,扩展在更新指南的第一步就中断了 运行 ng update @angular/core@8 @angular/cli@8 的轻微更新。

从那次更新开始,它就死了。 跳过这一步(我已经 运行 一个 v8 应用程序了)并尝试直接升级到 9,遗憾的是也杀死了它。

更新:

Richard 的回答似乎已经删除了所有日期扩展错误消息。 它似乎根本不喜欢 DateConstructor 接口的存在,而且在尝试他的方法时,它似乎对 moment 的用法也不是特别满意。

更新编辑:

日期扩展看起来与其他扩展完全一样,唯一的区别是那里有一个 import moment from 'moment' 行。删除这些东西似乎没有什么不同;就像 Dates 与 Strings 或 Arrays...

不同

我不得不从我的实现文件 (extensions.ts) 中删除 export {}; 并重复接口。

extensions.ts

interface String {
  format(...args: string[]): string;
  endsWith(searchString: string, position?: number): boolean;
}

if (!String.prototype.hasOwnProperty('format')) {
    String.prototype.format = function (...args: string[]): string {
        ...
    };
}

if (!String.prototype.hasOwnProperty('endsWith')) {
    String.prototype.endsWith = function (searchString, position) {
        ...
    };
}

另一个项目有错误,我好像已经缩小范围了!

我生成了类似于 Add only entry points to the 'files' or 'include' properties in your tsconfig 的警告。

查看并比较我正在更新的这个最新项目中的 tsconfig.app.json 文件与其他文件,结合上述警告,它脱颖而出!

之前的配置:

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

新配置,修复警告(添加文件 main 和 polyfills),然后修复扩展:

{
  "extends": "../tsconfig.json",
  "compilerOptions": {
    "outDir": "../out-tsc/app",
    "types": ["node"]
  },
  "files": [
    "main.ts",
    "polyfills.ts"
  ],
  "include": [
    "**/*.d.ts",
    "extensions/*.ts"
  ],
  "exclude": [
    "test.ts",
    "**/*.spec.ts"
  ]
}

似乎需要包含这样的文件!