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" 字段。