tengo una clase Typescript responsable de almacenar y recuperar cualquier objeto, su tipo y la fecha en que se almacenó el objeto en LocalStorage (código a continuación)
El problema es la propiedad "storageDate". Aunque durante el tiempo de compilación, TS menciona que el tipo es "Fecha", pero en tiempo de ejecución es una cadena. Por lo tanto, no puedo usar, por ejemplo, la función toDateString() en storageDate. ¿Alguna idea de por qué sucede esto y sugerencias sobre cómo escribirlo?
//Clase
export interface ILocalStorageReturnValue<T>{ storageDate:Date; storedObj:T } export class LocalStorage<T> implements ILocalStorage<T> { constructor(){ if( !window.localStorage) throw new Error(`[${constants.FrameWorkName}.LocalStorage]:${strings.ErrBrowserNoLclStrg}`) } public setItem(key: string, val: T): void{ if(!key || !val ) throw new Error(`[${constants.FrameWorkName}.LocalStorage.setItem]:${strings.ErrMissingKeyValProp}`) const newObj:ILocalStorageReturnValue<T> = { storedObj: val, storageDate: new Date() } window.localStorage.setItem(key ,JSON.stringify(newObj)) } public getItem(key: string): ILocalStorageReturnValue<T> | null{ return JSON.parse( window.localStorage.getItem(key)) ? <ILocalStorageReturnValue<T>>JSON.parse( window.localStorage.getItem(key)):null } }// acceso
const ls = new LocalStorage<IImage>().getItem(constants.localStorageKey) ls.storageDate().toDateString() --> throws an error saying toDateString is not a function .El problema es que su código no garantiza que la forma del objeto sea correcta cuando lo recupera del almacenamiento local. JSON no tiene ningún concepto de fechas, pero está devolviendo el resultado de JSON.parse (sin ninguna función de recuperación) y le dice a TypeScript que es un ILocalStorageReturnValue<T> . Pero no es uno, porque la fecha de storageDate ILocalStorageReturnValue una Date , y JSON.parse (sin una función de reactivación) nunca creará una Date . Tienes que hacer eso en tu código. La afirmación de tipo¹ es incorrecta, pero TypeScript confía en lo que le dices.
Dado que confía en el manejo predeterminado de fechas cuando almacena el elemento, la cadena storageDate en el almacenamiento local será compatible con new Date , por lo que podría hacer esto:
public getItem(key: string): ILocalStorageReturnValue<T> | null { const str = window.localStorage.getItem(key); if (!str) { return null; } const result = JSON.parse(str); result.storageDate = new Date(result.storageDate); return result; }¹ Tenga en cuenta que TypeScript no tiene conversión , tiene aserciones de tipo. Una aserción de tipo es puramente una cosa en tiempo de compilación. Es usted quien le dice a TypeScript el tipo de algo que tal vez no pueda descifrar. Las aserciones de tipo no tienen ningún efecto en tiempo de ejecución.