Är det giltigt att åsidosätta en egenskap i bas-klassen i JavaScript/TypeScript med ett getter-/setter-par i underklassen?


Nyligen har TypeScript infört ett kompileringfel när användaren försöker åsidosätta en egenskap i basklassen med ett getter/setter-par (egenskapsåtkomstförstärkning):

class BaseClass {
    prop        : string        = 'base_class'
}

class SubClass extends BaseClass {
    _prop       : string        = 'sub_class'

    /*
       ERROR: 'prop' is defined as a property in class 'BaseClass', but is overridden here in 'SubClass' as an accessor.
    */
    get prop () : string {
        return this._prop
    }
    set prop (value : string) {
        this._prop = value
    }
}
// try running this snippet with `useDefineForClassFields : true` and `useDefineForClassFields : false`
console.log((new SubClass).prop)

Detta fel motiveras av det faktum att i modern JavaScript har klassfält [[DEFINE]]-semantik och exemplet ovan kommer inte att fungera som intuitivt väntat om kompilatoralternativet useDefineForClassFields är inställt på true.

Mönstret för förstärkning av egenskapstillgång

Måste notera att historiskt sett använde ingen någonsin DEFINE-semantiken för klassens egenskaper. Nästan all JavaScript- och TypeScript-kod i världen antar för närvarande SET-semantiken för klassfält.

Mönstret för att utöka åtkomst till egendom är helt giltigt med SET-semantik. Det är mycket idiomatiskt JavaScript. Dess huvudsakliga användningsfall är att utlösa någon godtycklig kod vid läsning/skrivning av egendom. Detta är mycket användbart för en mängd olika ändamål och görs enkelt genom att åsidosätta egendomen i basklassen med ett par getter/setter-åtkomstmetoder.

TypeScript och JavaScript använde historiskt SET-semantik för klassfält. Efter att DEFINE-semantiken infördes lade TypeScript till den nya kompileringskonfigurationen useDefineForClassFields, som kontrollerar semantiken för klassfält och är inaktiverad som standard, eftersom det är en avbrottsförändring.

FRÅGOR:

  1. Tror du att mönstret för att förstärka egenskapsåtkomst är giltigt och bör stödjas av TypeScript, när semantiken för klassfält är [[Set]] (useDefineForClassFields=false vilket är standard)
  2. Använder du detta mönster i din JavaScript/TypeScript-kodbas? Om så är fallet, vänligen ge ett exempel på användningar som svar.

Se även: Förslag att begränsa kompilatorfelet till endast DEFINE-semantik

Svar #1

i vissa fall lägger jag till override i den utökade klassen

constructor(protected override httpClient: HttpClient) {

        super(httpClient);
        
    }


Relaterade artiklar