我需要在我的 NodeJS 后端和 Angular 前端之间共享一些通用接口(interface)。因此,我创建了一个仅包含一个库的新 Angular 项目。
这是一个接口(interface)的例子:
export interface EvPageRef {
page_id: string;
src_page: string;
}
如果我用 TypeScript 3.x 编译上面的代码,它什么都不输出。没有我所期望的 JavaScript 输出,但是如果我将上面的内容添加到 Angular 库中,那么我会得到以下内容。
/**
* @record
*/
function EvPageRef() { }
if (false) {
/** @type {?} */
EvPageRef.prototype.page_id;
/** @type {?} */
EvPageRef.prototype.src_page;
}
这是为dist/example
项目中的umd
、esm5
和ems2015
源代码文件夹生成的输出。
除上述内容外,还有 TypeScript 类型定义文件,其中包含预期的 interface
声明,它们位于 dist/example/lib
文件夹中。
所以我有两个问题:
- 为什么会这样,有什么意义?
- 这不会增加使用该库的 Angular 项目的大小吗?
最佳答案
将接口(interface)作为函数的 JavaScript 的输出由 tsickle 创建这是 Angular 模板的编译中间件,可生成对 Google Closure 友好的代码。
https://angular.io/guide/angular-compiler-options#annotateforclosurecompiler
文档中并不清楚为什么这是 Angular 构建过程的一部分。它还声明此选项默认为 false
。
我更新了我的 tsconfig.lib.json
以禁用该选项,现在我的 JavaScript 文件如预期的那样是空的。
tsconfig.lib.json:
"angularCompilerOptions": {
"annotateForClosureCompiler": false,
},
这个项目不包含任何组件,所以我很乐意关闭这个功能,但我很困惑为什么 Angular 库生成器会启用这个功能。该文档没有解释这样做有什么问题或好处。
我仍然会接受一个可以回答为什么打开它的答案。
关于angular - 为什么 Angular 将 TypeScript 接口(interface)编译成函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59565795/