首页 > 解决方案 > Angular 9 Ivy 构建 - 扩展错误

问题描述

早上好!

我最近将一个 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,遗憾的是也杀死了它。

更新:

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

更新编辑:

日期扩展看起来与其他扩展完全一样,唯一的区别是那里有一条import moment from 'moment'线。删除这些东西似乎没有什么区别。就像s 与s 或sDate是不同的野兽...StringArray

标签: angulartypescriptbuildangular-ivy

解决方案


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

扩展名.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) {
        ...
    };
}

推荐阅读