(#56) Data prototype use custrmers function. #65

Merged
MrKBear merged 2 commits from dev-mrkbear into master 2022-01-25 13:05:55 +08:00

View File

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