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.json
、tsconfig
s、main.ts
等之间的任何重大变化,但到目前为止,我一无所获。
谢谢。
编辑:
恢复并再次尝试升级,扩展在更新指南的第一步就中断了 运行 ng update @angular/core@8 @angular/cli@8
的轻微更新。
从那次更新开始,它就死了。
跳过这一步(我已经 运行 一个 v8 应用程序了)并尝试直接升级到 9,遗憾的是也杀死了它。
更新:
Richard 的回答似乎已经删除了所有日期扩展错误消息。
它似乎根本不喜欢 DateConstructor
接口的存在,而且在尝试他的方法时,它似乎对 moment
的用法也不是特别满意。
更新编辑:
日期扩展看起来与其他扩展完全一样,唯一的区别是那里有一个 import moment from 'moment'
行。删除这些东西似乎没有什么不同;就像 Date
s 与 String
s 或 Array
s...
不同
我不得不从我的实现文件 (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"
]
}
似乎需要包含这样的文件!
早上好!
我最近将一个 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.json
、tsconfig
s、main.ts
等之间的任何重大变化,但到目前为止,我一无所获。
谢谢。
编辑:
恢复并再次尝试升级,扩展在更新指南的第一步就中断了 运行 ng update @angular/core@8 @angular/cli@8
的轻微更新。
从那次更新开始,它就死了。 跳过这一步(我已经 运行 一个 v8 应用程序了)并尝试直接升级到 9,遗憾的是也杀死了它。
更新:
Richard 的回答似乎已经删除了所有日期扩展错误消息。
它似乎根本不喜欢 DateConstructor
接口的存在,而且在尝试他的方法时,它似乎对 moment
的用法也不是特别满意。
更新编辑:
日期扩展看起来与其他扩展完全一样,唯一的区别是那里有一个 import moment from 'moment'
行。删除这些东西似乎没有什么不同;就像 Date
s 与 String
s 或 Array
s...
我不得不从我的实现文件 (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"
]
}
似乎需要包含这样的文件!