Vyhledávání na webu

angular - TypeScript - Chyba při pokusu zavolat super setter/getter (reprodukovatelná pouze s úkolem prod)


Když se pokusím volat super getter nebo super setter při přepisování vlastností, dostanu chybu: TS2340: Přes klíčové slovo 'super' jsou přístupné pouze veřejné a chráněné metody základní třídy.

Tuto chybu dostávám pouze při spuštění 'ng build --configuration=production --stats-json'

Tato chyba se objevila poté, co jsem aktualizoval Angular z verze 7.2.11 na verzi 8.0.3 (TypeScript z verze 3.1.6 na verzi 3.4.5).

S Angular v7.2.11 a TypeScrypt v3.1.6 taková chyba není. Nepoužívám cílení na es5. Zkoušel jsem cílit na es2015, es2016, es2017, ale v každém případě dostávám stejnou chybu.

Ukázka kódu

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;
    }
}

Můj 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": [
        ...
       ]
}

Očekával jsem, že můj kód začne fungovat poté, co jsem přepnul na „target“: „es2015“, ale nestalo se tak. Možná jsou v mé konfiguraci nějaké chyby?

Také nepoužívám šipkové funkce, takže pokud tomu správně rozumím, můj problém nesouvisí s kontextem.

Odpověď č. 1

V Angular CLI verzi 8 a vyšší je rozdílové načítání (differential loading) ve výchozím nastavení povoleno pro příkaz ng build. Výsledkem jsou dvě sestavení a rozdílové načítání je povoleno. Pokud ignorujete prohlížeče bez podpory ES2015, je vytvořeno pouze jedno sestavení.

Toto můžete provést nastavením .browserlistrc, aby ignorovala nebo zahrnovala prohlížeče, které potřebujete. Jinak můžete přidat pole "browserslist" do vašeho package.json.