网站搜索

angular - TypeScript - 尝试调用 super 的 setter/getter 时出错(仅在生产任务中可重现)


当我尝试在重写属性时调用 super getter 或 super setter 会怎样?我得到一个错误:TS2340:基类的只有公共和受保护的方法可以通过 'super' 关键字访问。

这个错误我只有在执行 'ng build --configuration=production --stats-json' 时才会出现

在我将 Angular 从 v7.2.11 更新到 v8.0.3(TypeScript 从 v3.1.6 更新到 v3.4.5)之后出现了这个错误。

使用 Angular v7.2.11 和 TypeScript v3.1.6 时,没有这样的错误。我没有使用针对 es5 的编译。我尝试过 targeting es2015、es2016、es2017,但在每种情况下我都得到相同的错误。

代码示例

export abstract class ChildComponent extends ParentComponent {
    get selected(): boolean {
        return super.selected;
    }
    set selected(selected: boolean) {
        super.selected = selected;
    }
}
export abstract class ParentComponent {
    public get selected(): boolean {
        return this._selected;
    }
    public set selected(value: boolean) {
        this._selected = value;
    }
}

我的 tsconfig:

{
        "compileOnSave": false,
        "compilerOptions": {
                "downlevelIteration": true,
                "outDir": "./dist",
                "baseUrl": ".",
                "sourceMap": true,
                "declaration": false,
                "moduleResolution": "node",
                "module": "esnext",
                "emitDecoratorMetadata": true,
                "experimentalDecorators": true,
                "noEmitHelpers": true,
                "importHelpers": true,
                "esModuleInterop": true,
                "target": "es2015",
                "typeRoots": [
                       "node_modules/@types"
                ],
                "lib": [
                       "es2017",
                       "dom"
                ],
                "paths": {
                   ...
                }
        },
        "exclude": [
        ...
       ]
}

我原以为在我将“target”切换为“es2015”后,我的代码会开始工作,但并没有。也许我的配置中有错误?

我也不使用箭头函数,所以据我理解,我的问题与上下文无关。

答案#1

在 Angular CLI 8 及更高版本中,ng build 命令默认启用了差异加载。因此,这会生成两个构建,并启用差异加载。如果忽略不支持 ES2015 的浏览器,则只会生成一个构建。

你可以通过设置 .browserlistrc 来忽略或包含你需要的浏览器。或者,你可以在你的 package.json 中添加 "browserslist" 字段。