- 定义类型限制用户的输入
- 判断用户是否传入时间,如果传入了时间,进行格式处理,处理成时间戳,比较时间戳即可,如果没有传入时间直接存放即可。
type TDate = 'h' | 'w'| 'd' | 'm' |'s'
type TExpire = `${number}${TDate}`;
interface IStorage{
value: any,
key: string,
expire?:TExpire
}
const storageUtil = {
set(data: IStorage) {
if (data.expire) {
const date = {expire:0}
data?.expire && this.processExpire(data.expire,date)
localStorage.setItem(data.key, JSON.stringify({ expire: date.expire, value: data.value }))
} else {
localStorage.setItem(data.key, JSON.stringify(data.value))
}
},
get(key: string) {
let res = localStorage.getItem(key) as any
res && (res = JSON.parse(res))
console.log(res?.expire,new Date().getTime());
if (res?.expire && res.expire < new Date().getTime()) {
localStorage.removeItem(key)
res = null
}
return res
},
delete(key: string) {
localStorage.removeItem(key)
},
processExpire(expire: TExpire, date: { expire: number }) {
const time = expire.match(/\d/)![0],
timerUnit: TDate = expire.split(time)[1].toLocaleLowerCase() as TDate
switch (timerUnit) {
case 's':
date.expire = Number(time) * 1000
break
case 'm':
date.expire = Number(time) * 1000 * 60
break
case 'h':
date.expire = Number(time) * 1000 * 60 * 60
break
case 'd':
date.expire = Number(time) * 1000 * 60 * 60 * 24
break
case 'w':
date.expire = Number(time) * 1000 * 60 * 60 * 24 * 7
break
}
date.expire += new Date().getTime()
}
}
export default () => {
return storageUtil
}