离子构建已开始失败,并显示“装饰器不支持函数表达式”

Ionic build has begun failing with `Function expressions are not supported in decorators`

我已经 运行ning an open source project 突然开始失败构建。我已经阅读了无数关于 SO 的答案(有类似的错误消息,但没有有效的解决方案)和 GitHub 个关于这个问题的线程,但未能查明问题所在。

当我 运行 ionic build --prod 我收到 AOT 导致的错误,其中指出:

Function expressions are not supported in decorators in 'AutoCompleteModule'
    'AutoCompleteModule' references 'ɵ4'
      'ɵ4' contains the error at ../index.js.ts(698,41)
        Consider changing the function expression into an exported function.

这是有问题的代码(第一行是错误消息中引用的行):

var AutoCompleteModule = /** @class */ (function () {
    function AutoCompleteModule() {
    }
    AutoCompleteModule_1 = AutoCompleteModule;
    AutoCompleteModule.forRoot = function () {
        return {
            ngModule: AutoCompleteModule_1,
            providers: []
        };
    };
    var AutoCompleteModule_1;
    AutoCompleteModule = AutoCompleteModule_1 = __decorate([
        NgModule({
            declarations: [
                AutoCompleteComponent,
                BoldPrefix
            ],
            exports: [
                AutoCompleteComponent,
                BoldPrefix
            ],
            imports: [
                CommonModule,
                FormsModule,
                IonicModule
            ]
        })
    ], AutoCompleteModule);
    return AutoCompleteModule;
}());

export { AutoCompleteComponent, AutoCompleteModule, AutoCompleteOptions, BoldPrefix };
//# sourceMappingURL=index.js.map

我尝试删除箭头函数,我尝试删除装饰器(即 @class@param),我尝试更改汇总,我尝试修改我的 tsconfig 文件,更改我的导入,还有更多。

这是我所有的进口商品:

import { Input, Output, ViewChild, ElementRef, HostListener, Component, EventEmitter, TemplateRef, Pipe, Injectable, NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
import { Platform, IonicModule } from '@ionic/angular';
import { Subject, from, Observable } from 'rxjs';
import { finalize } from 'rxjs/operators';

Function expressions are not supported in decorators in 'AutoCompleteModule'

遗憾的是,此错误消息完全没用。

我唯一一次看到出现此错误的情况是 node_modules 文件夹的内部导入

例如;

import {concat} from 'rxjs/src/internal/observable/concat';

上面的示例导入了本不打算使用的源代码,源代码内部发生的是装饰器等 TypeScript 功能的声明。这些可以被 Angular AOT 编译器获取,从而引发上述错误。错误通常在远离有问题的导入存在的地方抛出。

因为在开发模式下AOT被关闭了。错误是沉默的。

所以仔细检查你所有的导入。

我发现在我生成的 dist 文件中我的 index.d.ts 需要从这个改变:

export * from './auto-complete/auto-complete.component';
export * from './auto-complete.service';
export * from './bold-prefix.pipe';
export * from './auto-complete-options.model';
export declare class AutoCompleteModule {
    static forRoot(): ModuleWithProviders;
}

进入这个:

import {NgModule, ModuleWithProviders} from '@angular/core';
import {CommonModule} from '@angular/common';
import {FormsModule} from '@angular/forms';

import {IonicModule} from '@ionic/angular';

import {AutoCompleteComponent} from './auto-complete/auto-complete.component';
import {BoldPrefix} from './bold-prefix.pipe';

export * from './auto-complete/auto-complete.component';
export * from './auto-complete.service';
export * from './bold-prefix.pipe';
export * from './auto-complete-options.model';

@NgModule({
    declarations: [
        AutoCompleteComponent,
        BoldPrefix
    ],
    exports: [
        AutoCompleteComponent,
        BoldPrefix
    ],
    imports: [
        CommonModule,
        FormsModule,
        IonicModule
    ]
})
export declare class AutoCompleteModule {
    static forRoot(): ModuleWithProviders;
}

虽然这可行,但似乎更像是一种解决方法。