En JavaScript y/o TypeScript, ¿cuál es el enfoque común para resolver el siguiente problema?
Supongamos que tenemos una clase cuyo constructor depende de alguna operación. Si esa operación falla, la instancia no debe crearse.
Ejemplo:
class Item { constructor(itemId) { // Try to get the data for the passed-in item id const itemData = itemDataMap.get(itemId); // If the item data was found if (itemData) { // Great, continue to init the instance as normal... } else { // Problem: We can't init the instance without the item data. // Hence we don't want to return an instance. // What should we do here? } } }Las soluciones que se me ocurren incluyen tratar de devolver un objeto vacío o arrojar un error. Pero, ¿hay un enfoque común/preferido?
Personalmente, me gusta tener constructores puros sin efectos secundarios. Simplemente pasa datos y crea su objeto. Es mucho más fácil de usar, probar y depurar.
Y si desea tener un efecto secundario (como validación, obtención de datos), cree una función estática en el objeto que será responsable de eso.
Otra cosa buena es que puede convertir esa función en una función asíncrona sin ningún problema (los constructores no pueden ser asíncronos).
class Item { constructor(data) { //... } static create(id) { if (id === 1) { throw new Error("my error") } return new Item({ id }) } } console.log(Item.create(2)) console.log(Item.create(1))