Compare commits

..

No commits in common. "b2854908a4bcee544062fc8d9021cad6532a6620" and "33e49cb8befa3a9b76f346c47051adbacee42f9b" have entirely different histories.

View File

@ -1,4 +1,3 @@
import { Storage } from "./Storage";
/** /**
* *
@ -13,22 +12,22 @@ interface IDataParamSettingItem {
/** /**
* *
*/ */
get: (...P: any) => this["type"] | INone; isGet: boolean;
/** /**
* *
*/ */
set: (...P: [this["type"], ...any]) => any | INone; isSet: boolean;
/** /**
* *
*/ */
getAsync?: (...P: any) => Promise<this["type"]> | INone; isGetAsync?: boolean;
/** /**
* *
*/ */
setAsync?: (...P: [this["type"], ...any]) => Promise<any> | INone; isSetAsync?: boolean;
} }
/** /**
@ -38,7 +37,12 @@ interface IDataParamSetting {
[x: string]: IDataParamSettingItem [x: string]: IDataParamSettingItem
} }
type INone = undefined | void; type IGet<T> = () => T;
type IGetAsync<T> = () => Promise<T>;
type ISet<T> = (data: T) => INone;
type ISetAsync<T> = (data: T) => Promise<INone>;
type INone = undefined | void | unknown;
/** /**
* *
@ -48,24 +52,22 @@ type IRegistryItem<S extends IDataParamSettingItem> = {
/** /**
* *
*/ */
get: S["get"]; get: S["isGetAsync"] extends true ? INone : S["isGet"] extends true ? IGet<S["type"]> : INone;
/** /**
* *
*/ */
getAsync: S["getAsync"] extends Function ? S["getAsync"] : getAsync: S["isGet"] extends true ? IGetAsync<S["type"]> : INone;
S["get"] extends Function ? (...param: Parameters<S["get"]>) => Promise<S["type"]> : INone;
/** /**
* *
*/ */
set: S["set"]; set: S["isSetAsync"] extends true ? INone : S["isSet"] extends true ? ISet<S["type"]> : INone;
/** /**
* *
*/ */
setAsync: S["setAsync"] extends Function ? S["setAsync"] : setAsync: S["isSet"] extends true ? ISetAsync<S["type"]> : INone;
S["set"] extends Function ? (...param: Parameters<S["set"]>) => Promise<ReturnType<S["set"]>> : INone;
} }
/** /**
@ -89,16 +91,16 @@ type IAutoSelect<IF extends boolean, A, B> = IF extends true ? A : B;
* ```typescript * ```typescript
* class TestData extends Data<{ * class TestData extends Data<{
* test: { * test: {
* type: number * type: number,
* get: () => number, * isGet: true,
* set: (val: number) => void, * isSet: true,
* getAsync: () => Promise<number> * isGetAsync: true
* } * }
* }> { * }> {
* public onLoad() { * public onLoad() {
* let dataObject = {key: 1} * let dataObject = {key: 1}
* this.getter("test", () => 1); * this.getter("test", () => 1);
* this.registerKeyFromObject(dataObject, "test", "key"); * this.registerKeyFromObject("test", "key", dataObject);
* } * }
* } * }
* ``` * ```
@ -181,9 +183,9 @@ class Data<D extends IDataParamSetting> {
*/ */
protected registerKeyFromObject< protected registerKeyFromObject<
KEY extends keyof D, KEY extends keyof D,
F extends string, F extends keyof O,
O extends {[K in F]: D[KEY]["type"]} O extends {[K in F]: D[KEY]["type"]}
> (object: O, key: KEY, keyFromObject: F = key as any) { > (key: KEY, keyFromObject: F, object: O) {
// 注册同步获取 // 注册同步获取
this.getter(key, () => { this.getter(key, () => {
@ -196,33 +198,6 @@ class Data<D extends IDataParamSetting> {
}) })
} }
/**
* Storage key
* @param key Data
* @param keyFromStorage StorageKey
*/
protected registerKeyFromStorage<
KEY extends keyof D,
F extends string,
S extends Storage<{[K in F]: D[KEY]["type"]}>
> (storage: S, key: KEY, keyFromStorage: F = key as any) {
// 同步获取
this.getter(key, () => {
return storage.get(keyFromStorage);
});
// 同步设置
this.setter(key, (data: any) => {
storage.set(keyFromStorage, data);
});
// 异步设置
this.setter(key, (async (data: any) => {
await storage.set(keyFromStorage, data);
}) as any, true);
}
/** /**
* *
* @returns * @returns
@ -248,12 +223,12 @@ class Data<D extends IDataParamSetting> {
// 检验 getter // 检验 getter
if (item.get && !item.getAsync) { if (item.get && !item.getAsync) {
item.getAsync = this.syncFn2AsyncFn(item.get) as any; item.getAsync = this.syncFn2AsyncFn(item.get as IGet<D[KEY]["type"]>);
} }
// 检验 setter // 检验 setter
if (item.set && !item.setAsync) { if (item.set && !item.setAsync) {
item.setAsync = this.syncFn2AsyncFn(item.set) as any; item.setAsync = this.syncFn2AsyncFn(item.set as ISet<D[KEY]["type"]>);
} }
} }
@ -265,13 +240,11 @@ class Data<D extends IDataParamSetting> {
* *
* @param fn * @param fn
*/ */
protected syncFn2AsyncFn<F extends (...p: any) => any> (fn: F): (...param: Parameters<F>) => ReturnType<F> { protected syncFn2AsyncFn<D, H extends (IGet<D> | ISet<D>)> (fn: H):
IAutoSelect<H extends IGet<D> ? true : false, IGetAsync<D>, ISetAsync<D>> {
const asyncFn = async (...param: [D]) => { const asyncFn = async (...param: [D]) => {
return fn(...param); return fn(...param);
}; };
return asyncFn as any; return asyncFn as any;
} }
} }
export { Data };
export default Data;