【问题标题】:Angular 9 Ivy build - extension errorsAngular 9 Ivy 构建 - 扩展错误
【发布时间】:2020-06-07 18:19:48
【问题描述】:

早上好!

我最近将一个 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' 行。删除这些东西似乎没有什么区别。就像 Dates 与 Strings 或 Arrays 不同的野兽......

【问题讨论】:

  • 您必须将 "include": [ "src/**/*.d.ts" ] 独占添加到您的 tsconfig.app.json
  • @KathakDabhi - 感谢您的回复。是的,已经在里面了,不是那样的。
  • typings.d.ts 文件的 parh 是什么,确保它在 src 目录中。
  • src/typings.d.ts,和我升级前一样。
  • @Kremon,只有当我删除了 typings.d.ts 时,我才能生成相同的错误,否则它可以在 Angular 9 项目中正常工作。但是您可以创建新的 Angular 9 项目并比较两个项目的配置文件以检查是否有异常。

标签: angular typescript build angular-ivy


【解决方案1】:

我必须从我的实现文件 (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) {
        ...
    };
}

【讨论】:

  • 那...似乎奏效了!谢谢你。我的字符串/数组/对象扩展不再有错误,但我对Date 扩展不满意。同样的修复似乎不适用于那些。有什么建议吗?
  • 不确定,能否用日期扩展的代码 sn-p 更新
  • 没什么意义,它看起来完全和所有其他扩展一样。 Date.xxx = function... 用于构造函数扩展,Date.prototype.xxx = function... 用于其余部分,与其他类似。
  • 认为我会接受失败,并将我的 Date 扩展转换为静态方法或其他东西,除非有人碰巧弄明白了。至少其他扩展都很好,所以谢谢你,你可以得到你的答案:)
  • 嘿,很抱歉回复晚了,我在我的解决方案中测试了一个日期扩展并且它有效,所以 IDK。仔细检查错误,也许它是不同的东西。感谢您的勾选!
【解决方案2】:

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

我构建了类似于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"
  ]
}

似乎需要包含此类文件!

【讨论】:

    猜你喜欢
    • 2020-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-01
    • 2020-08-03
    • 1970-01-01
    • 2020-06-04
    • 2016-09-12
    相关资源
    最近更新 更多