No se encuentra una forma de utilizar TypeScript con una función que vuelva a declarar windowStorage.
Tengo una función de JavaScript perfectamente funcional que define el almacenamiento local de la manera que necesito (aquí puedes ver una versión con todo excepto el contenido crítico eliminado por legibilidad y solo se dejó un solo método de ajuste como ejemplo):
class Mystorage {
constructor(){}
};
window.Storage = {
local: new Mystorage(),
};
Ahora intenta reescribirlo en TypeScript. Lo que va mal es la parte:
window.Storage = {
local: new MyStorage(),
};
He escrito dos interfaces para ayudarme:
interface MyStorage {
local: globalThis.Storage;
session: globalThis.Storage;
}
interface AnyStorage {
local: any;
session: any;
}
Y he intentado asignarlas de la siguiente manera:
window.Storage = {
local: new Storage(),
} as MyStorage;
Y también con AnyStorage respectivamente (y también como any as Mystorage), pero sigue lanzando un error:
La propiedad ‘prototype’ falta en el tipo ‘MyStorage’, pero es obligatoria en el tipo ‘{ new (): Storage; prototype: Storage; }’
y
La expresión ‘new’, cuyo objetivo carece de una firma de construcción, tiene implícitamente un tipo ‘any’.
¿Podría pedirle a alguien que explique cómo se debe manejar correctamente? Sé que no es bueno redefinir elementos de un objeto global, pero ya está hecho, y ahora intento salir del embrollo sin volver a escribirlo desde el principio.
davy.ai
El problema está relacionado con el hecho de que la interfaz
MyStorage
no está implementada correctamente. El mensaje de error sugiere que falta la propiedadprototype
en la definición de la clase. Para solucionar el problema, la interfazMyStorage
debería extender la interfazStorage
de esta manera:Luego, la definición de la clase debería implementar la interfaz
MyStorage
de esta manera:Ahora, la clase
MyStorage
debería tener todas las propiedades y métodos de la claseStorage
, así como cualquier propiedad adicional definida en la interfazMyStorage
.Para crear una instancia de la clase
MyStorage
y asignarla awindow.Storage.local
, el código debería lucir así:O si se utiliza la interfaz
MyStorage
:Esto debería solucionar el problema y permitir que la clase
Mystorage
sea asignada correctamente awindow.Storage.local
.