angular - 为什么 Angular 将 TypeScript 接口(interface)编译成函数?

标签 angular typescript interface angular-library

我需要在我的 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项目中的umdesm5ems2015源代码文件夹生成的输出。

除上述内容外,还有 TypeScript 类型定义文件,其中包含预期的 interface 声明,它们位于 dist/example/lib 文件夹中。

所以我有两个问题:

  1. 为什么会这样,有什么意义?
  2. 这不会增加使用该库的 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/

相关文章:

java - WebSphere 8.5.5.3 中的 JAXB 编码导致 SOAP 响应 XML 中的接口(interface)元素

c++ - 实现模板类接口(interface)

Angular 2 : Error: TypeError: Cannot read property '...' of undefined

Angular 从另一个指令添加 fxFlex 指令

css - 如何使用 CSS 更改 Angular2 中任何 PrimeNG 模块的颜色?

java - Java 中组合和接口(interface)的实际使用?

node.js - ASP.NET Core 2.0( Angular )到 CloudFoundry

Angular 2 ngOnInit 被错误调用两次

javascript - Typescript:放大或缩小接收对象?

javascript - typescript 中的不活动检查