Recientemente, TypeScript ha introducido un error de compilación , cuando el usuario intenta anular una propiedad en la clase base con un par getter/setter (aumento de acceso a la propiedad):
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) Este error está motivado por el hecho de que en el JavaScript moderno, los campos de clase tienen una semántica [[DEFINE]] y el ejemplo anterior no funcionará como se espera intuitivamente si la opción del compilador useDefineForClassFields se establece en true .
Es necesario tener en cuenta que, históricamente, nadie usó la semántica DEFINE para las propiedades de clase. Prácticamente todo el código JavaScript y TypeScript del mundo actualmente asume la semántica SET para los campos de clase.
El patrón de aumento de acceso a la propiedad es perfectamente válido con la semántica SET. Su JavaScript muy idiomático. Su principal caso de uso es activar algún código arbitrario en la propiedad de lectura/escritura. Esto es muy útil para una variedad de propósitos y se realiza simplemente anulando la propiedad de la clase base con un par de accesores getter/setter.
Históricamente, TypeScript y JavaScript usaban la semántica SET para los campos de clase. Después de que se introdujo la semántica DEFINE, TypeScript agregó la nueva configuración del compilador, useDefineForClassFields , que controla la semántica de los campos de clase y está deshabilitada de forma predeterminada, porque es un cambio importante.
PREGUNTAS:
useDefineForClassFields=false , que es un valor predeterminado)Ver también: Propuesta para limitar el error de compilación a DEFINE solo semántica