storage-data应用接口文档

目录

内容

1. 相关文章

2. createStorageData()

createStorageData() 函数用来创建 会自动将自己保存到 storage (如:localStoragesessionStorage,或自定的 DataStorage 类型的对象)的数据对象,并且可以给数据对象的属性值设置有效期,如果过了有效期,则该属性会返回 undefined,并且会自动删除该属性;

function createStorageData<D = any>(storage: DataStorage, dataKey: string, options?: StorageDataOptions<D> | null, withSave?: boolean): StorageData<D> | StorageDataObject<StorageData<D>>

参数:

  1. storage : DataStorage 指定要保存到哪个 storage 对象中
  2. dataKey : string 指定保存在 storage 中的 key
  3. options : StorageDataOptions 配置选项
  4. withSave : boolean 是否返回带有 save 方法的 StorageDataObject 类型的对象,StorageDataObject 对象的 save 方法可用于手动触发保存操作;

返回:
返回的一个会自动保存自己的数据对象

  • 如果指定 noExpirestrue :返回 D 类型的数据对象,该对象不具备有效期功能;
  • 如果指定 noExpiresfalse :返回 StorageData<D> 类型的数据对象,该对象具备有效期功能;
  • 如果指定 withSavetrue :会返回 StorageDataObject 类型的对象,该对象的 data 属性是 StorageData<D>D 类型的值,当更改该值的属性时,它会自动保存自己;该对象的 save 方法用于立即保存该对象的 data

当你更新 StorageData<D>D 类型的对象的属性时,它会自动将该对象保存到 指定的 storage 中;如果没有将 noExpires 设置为 true,则也可以给该对象的属性设置有效期,如果过了有效期,则该属性会返回 undefined,并且会自动删除该属性;

3. DataStorage

DataStorage 负责将最终序列化后的字符串持久化;
它是一个接口,描述了持久实例应该具备的API,如下:

interface DataStorage {
    // 获取 与指定 key 相关联的值;
    getItem(key: string): string | null;
    
    // 设置 指定 key 与 指定的 value 相关
    setItem(key: string, value: string): void;
}

浏览器中提供的 Storage 类型的对象(如:localStoragesessionStorage)均符合 DataStorage 接口的定义;

4. StorageDataOptions

StorageDataOptions 是传 createStorageData() 函数的选项对象的类型;

interface StorageDataOptions<D> {
  noExpires?:boolean;    //可选;默认值:false; 是否禁用有效期功能
  delay?:Millisecond|null;    //可选;默认值:null; 延时保存的毫秒数;用于对保存进行节流的时间; null | undefined | 小于0的值:无效;0:异步立即保存; 大于0的值:延迟保存
  changeNum?:number|null;   //可选; 默认值:1; 表示累计变化多少次时才执行保存; null | undefined | 小于1的值:都作为 1 来对待;
  willChange?:<Key extends keyof D>(key:Key,newValue:D[Key],oldValue:D[Key],data:D)=>any; //在Item变更前触发;返回真值,表示停止变更,会取消本次更改,返回假值,表示继续变更;
  changed?:<Key extends keyof D>(key:Key,newValue:D[Key],oldValue:D[Key],data:D)=>void;   //在Item变更后触发;
  willSave?:(data:D,manual:boolean)=>any;   //在将数据保存到DataStorage前时触发;manual 表示本次保存操作是否是手动触发的,即:不是自动触发的;返回真值,表示停止保存,会取消本次保存操作,返回假值,表示继续保存;
  saved?:(data:D)=>void;   //在将数据保存到DataStorage后触发
}
  • noExpires?:boolean:可选;默认值:false; 是否禁用有效期功能
  • delay?:Millisecond|null:可选;默认值:null; 延时保存的毫秒数;用于对保存进行节流的时间; null | undefined | 小于0的值:无效; 0:异步立即保存; 大于0的值:延迟保存
  • changeNum?:number|null:可选; 默认值:1; 表示累计变化多少次时才执行保存; null | undefined | 小于1的值:都作为 1 来对待;
  • willChange?:<Key extends keyof D>(key:Key,newValue:D[Key],oldValue:D[Key],data:D)=>any: 在Item变更前触发;返回真值,表示停止变更,会取消本次更改,返回假值,表示继续变更;
  • changed?:<Key extends keyof D>(key:Key,newValue:D[Key],oldValue:D[Key],data:D)=>void:在Item变更后触发;
  • willSave?:(data:D,manual:boolean)=>any:在将数据保存到 DataStorage 前时触发;manual 表示本次保存操作是否是手动触发的,即:不是自动触发的;返回真值,表示停止保存,会取消本次保存操作,返回假值,表示继续保存;
  • saved?:(data:D)=>void:在将数据保存到DataStorage后触发

如果 同时指定了 changeNum 和 delay ,则只要这两个条件任意之一满足,就会执行保存操作;

5. StorageData

StorageData 描述的是一种当属性值变更时会自动存储数据到 storage 中、并且可以指定属性值有效期的对象的类型;

type StorageData<D> = {
    [P in keyof D]: StorageDataItem<D[P]>;
};

6. StorageDataItem

StorageDataItem 描述的是存储在 StorageData 中的 数据项目;

type StorageDataItem<V> = V | StorageDataExpiresItem<V> | undefined;

之所以要包含 undefined 是因为当获取 数据项目 的值时,如果值过期了,则会返回 undefined

7. StorageDataExpiresItem

StorageDataExpiresItem 描述的是 StorageData 中 带有有效期的数据项目;

interface StorageDataExpiresItem<V> {
  maxAge?: ExpiresDate|null;   //可选;默认无限长;有效时长,即多长时间后失效;
  startTime?: ExpiresDate|null;  //可选;默认值:当前时间; 表示开始计时的时间;这个一般不需要指定;
  expires?: ExpiresDate|null;  // 可靠;默认:无限远; 表示失效日期,即到什么时间点后失效;
  value: V;  //必选;要保存的值;
}

如果数据项目中 即指定了 maxAge,又指定了 expires,则只要 maxAgeexpires 中有一个过期(失效),就算失效;

StorageDataExpiresItem 的类型守卫是:

function isStorageDataExpiresItem(target: any): target is StorageDataExpiresItem<any>

8. ExpiresDate有效期

type ExpiresDate = Millisecond | Date | DateDescription | string

注意:如果 ExpiresDatestring 类型的值,则必须是能被 Date() 所识别的时间字符串格式;

9. Millisecond毫秒

Millisecond 是表示毫秒的类型,实际是一个 number 类型

type Millisecond = number;

10. DateDescription日期描述

DateDescription 是用来 描述时间的;

interface DateDescription {
  year?: number;  //年
  month?: number;  //月;**注意:从1开始,并不是从0开始** 
  day?: number;  //日;
  hour?: number;  //时
  minute?: number; //分
  second?: number;  //秒
  millisecond?: number;  //毫秒
}

注意:月分 month 是从 1开始的;即 1表示 1月,2表示 2月,这与 Date 类型的 月分不一样;

11. StorageDataObject

StorageDataObject 描述的是一个API集合,包含带有 StorageData 成员 及其 相关操作的API;

interface StorageDataObject<SD> {
  data:SD;  // StorageData 类型的对象,更改它的直接属性会自动保存;
  save():boolean;  //手动触发 data(StorageData对象)保存的方法
}

12. parseStorageDataItem()

解析 StorageDataItem 类型的值的有效性

function parseStorageDataItem<V extends StorageDataItem<any>>(item: V): ValidityDescription<GetValueFromStorageDataItem<V>>

13. ValidityDescription有效性描述

ValidityDescription 是用来描述值的有效性类型

type ValidityDescription<V> = {
    isValid: boolean;
    value: V;
}

14. GetValueFromStorageDataItem

将 StorageDataItem 类型 转为其值类型

type GetValueFromStorageDataItem<SDItem> = SDItem extends StorageDataExpiresItem<any> ? SDItem['value'] : SDItem

15. parseExpiresDate()

将 ExpiresDate 类型的值解析 为 Date 类型的值

function parseExpiresDate(expiresDate: ExpiresDate): Date
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,233评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,013评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,030评论 0 241
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,827评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,221评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,542评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,814评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,513评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,225评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,497评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,998评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,342评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,986评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,812评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,560评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,461评论 2 266

推荐阅读更多精彩内容