Me sorprendió que no pudiera encontrar nada sobre clases abstractas cuando leía en ES6. (Por "clase abstracta" me refiero al significado de Java, en el que una clase abstracta declara firmas de métodos que una subclase debe implementar para ser instanciable).
¿Alguien sabe de alguna convención que se haya establecido para implementar clases abstractas en ES6? Sería bueno poder detectar una violación de clase abstracta con análisis estático.
Si tuviera que generar un error en tiempo de ejecución para indicar un intento de instanciación de clase abstracta, ¿cuál sería el error?
ES2015 no tiene clases de estilo Java con posibilidades integradas para su patrón de diseño deseado. Sin embargo, tiene algunas opciones que pueden ser útiles, dependiendo exactamente de lo que esté tratando de lograr.
Si desea una clase que no se puede construir, pero cuyas subclases sí, puede usar new.target :
class Abstract { constructor() { if (new.target === Abstract) { throw new TypeError("Cannot construct Abstract instances directly"); } } } class Derived extends Abstract { constructor() { super(); // more Derived-specific stuff here, maybe } } const a = new Abstract(); // new.target is Abstract, so it throws const b = new Derived(); // new.target is Derived, so no error Para obtener más detalles sobre new.target , puede leer esta descripción general de cómo funcionan las clases en ES2015: http://www.2ality.com/2015/02/es6-classes-final.html
Si está buscando específicamente que se requiera la implementación de ciertos métodos, también puede verificarlo en el constructor de la superclase:
class Abstract { constructor() { if (this.method === undefined) { // or maybe test typeof this.method === "function" throw new TypeError("Must override method"); } } } class Derived1 extends Abstract {} class Derived2 extends Abstract { method() {} } const a = new Abstract(); // this.method is undefined; error const b = new Derived1(); // this.method is undefined; error const c = new Derived2(); // this.method is Derived2.prototype.method; no error