Estoy tratando de construir un contenedor TS para localStorage con un esquema TS que define todos los valores posibles en localStorage. El problema es que no puedo averiguar cómo escribir el valor de retorno para que se asigne al tipo apropiado del esquema: por ejemplo, si quiero llamar a LocalStorage.get ("algún_número"), quiero que el tipo de retorno sea de número de tipo. ¿Es esto posible en TS?
¡El valor del parámetro escrito por teclas funciona muy bien para la entrada!
type Values = LocalStorageSchema[Keys] devuelve el tipo de unión de los valores que no es lo que estoy buscando.
Además, parece que no es posible usar la tecla variable en la función de obtención para reducir el tipo...
También he investigado los tipos genéricos: LocalStorage.get(...) pero creo que eso anula todo el punto de escribir el valor de retorno.
¿Alguien tiene ideas para esto? ¡Gracias!
type LocalStorageSchema = { token: string; some_string: string; some_number: number; }; type Keys = keyof LocalStorageSchema; // type Values = LocalStorageSchema[Keys]; ??? export const LocalStorage = { get(key: Keys): any { const data = window.localStorage.getItem(key); //type ReturnType = ??? if (data !== null) { return data; } console.error(`localStorage missing object with key ${key}`); return null; }, set(key: Keys, value: any) { window.localStorage.setItem(key, value); }, remove(key: Keys) { window.localStorage.removeItem(key); }, clear() { window.localStorage.clear(); }, };Puede usar genérico como en este enlace . Todavía quedan algunos errores por corregir. Enlace sobre cómo manejar valores nulos. Depende de ti, así que no lo arreglé.
¡Utilice genéricos para devolver el tipo correcto para la clave!
type LocalStorageSchema = { token: string; some_string: string; some_number: number; }; type Keys = keyof LocalStorageSchema; export const LocalStorage = { get<T extends Keys>(key: T): LocalStorageSchema[T] | null { // Return type will depend on the key const data = window.localStorage.getItem(key); //type ReturnType = ??? if (data !== null) { return data as LocalStorageSchema[T]; } console.error(`localStorage missing object with key ${key}`); return null; }, set<T extends Keys>(key: T, value: LocalStorageSchema[T]) { window.localStorage.setItem(key, value as any); }, remove(key: Keys) { window.localStorage.removeItem(key); }, clear() { window.localStorage.clear(); }, }; const a = LocalStorage.get('token'); // string | null