es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for 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 propiedad prototype en la definición de la clase. Para solucionar el problema, la interfaz MyStorage debería extender la interfaz Storage de esta manera:

    interface MyStorage extends Storage {
      // propiedades adicionales pueden ser añadidas aquí
    }
    

    Luego, la definición de la clase debería implementar la interfaz MyStorage de esta manera:

    class Mystorage implements MyStorage {
      // implementación de la clase
    }
    

    Ahora, la clase MyStorage debería tener todas las propiedades y métodos de la clase Storage, así como cualquier propiedad adicional definida en la interfaz MyStorage.

    Para crear una instancia de la clase MyStorage y asignarla a window.Storage.local, el código debería lucir así:

    window.Storage = {
      local: new Mystorage(),
    }
    

    O si se utiliza la interfaz MyStorage:

    window.Storage = {
      local: new Mystorage(),
    } as MyStorage
    

    Esto debería solucionar el problema y permitir que la clase Mystorage sea asignada correctamente a window.Storage.local.

Comments are closed.