type Timer = ReturnType; type CachedKey = string | number; export interface CachedData { data: TData; params: TParams; time: number; } interface RecordData extends CachedData { timer: Timer | undefined; } const cache = new Map(); export const setCache = (key: CachedKey, cacheTime: number, cachedData: CachedData) => { const currentCache = cache.get(key); if (currentCache?.timer) { clearTimeout(currentCache.timer); } let timer: Timer | undefined = undefined; if (cacheTime > -1) { // if cache out, clear it timer = setTimeout(() => { cache.delete(key); }, cacheTime); } cache.set(key, { ...cachedData, timer, }); }; export const getCache = (key: CachedKey) => { return cache.get(key); }; export const clearCache = (key?: string | string[]) => { if (key) { const cacheKeys = Array.isArray(key) ? key : [key]; cacheKeys.forEach((cacheKey) => cache.delete(cacheKey)); } else { cache.clear(); } };