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(); const setCache = (key: CachedKey, cacheTime: number, cachedData: CachedData) => { const currentCache = cache.get(key); if (currentCache?.timer) { clearTimeout(currentCache.timer); } let timer: Timer | undefined; if (cacheTime > -1) { // if cache out, clear it timer = setTimeout(() => { cache.delete(key); }, cacheTime); } cache.set(key, { ...cachedData, timer }); }; const getCache = (key: CachedKey) => { return cache.get(key); }; const clearCache = (key?: string | string[]) => { if (key) { const cacheKeys = Array.isArray(key) ? key : [key]; cacheKeys.forEach(cacheKey => cache.delete(cacheKey)); } else { cache.clear(); } }; export { clearCache, getCache, setCache };