From e97514a67fd872ac7edf203deb256889df8f5a2c Mon Sep 17 00:00:00 2001 From: mrkbear Date: Sat, 22 Jan 2022 17:49:03 +0800 Subject: [PATCH 1/3] (#60) Core emitter generic optimization --- miniprogram/api/EduBase.ts | 18 +++++++++--------- miniprogram/core/Api.ts | 24 ++++++++++++------------ miniprogram/modular/Mask/Mask.ts | 4 ++-- miniprogram/pages/Account/Account.ts | 4 ++-- miniprogram/pages/Account/UserCard.ts | 4 ++-- 5 files changed, 27 insertions(+), 27 deletions(-) diff --git a/miniprogram/api/EduBase.ts b/miniprogram/api/EduBase.ts index 041fbb5..0ab5614 100644 --- a/miniprogram/api/EduBase.ts +++ b/miniprogram/api/EduBase.ts @@ -1,7 +1,7 @@ import { API, IAnyData, GeneralCallbackResult } from "../core/Api"; -import { EventType } from "../core/Emitter"; +import { EventType, Emitter } from "../core/Emitter"; -interface ILoginEvent { +type ILoginEvent = { /** * session 过期 @@ -56,37 +56,37 @@ abstract class EduBase< if(!info) { isSuccess = false; errMsg = "Bad Data"; - this.emit("badData", { errMsg }); + (this as Emitter).emit("badData", { errMsg }); } if (isSuccess) switch (info.code) { case (1): res = parseFunction(info.data); errMsg = info.err_msg ?? "Success"; - this.emit("ok", res!); + (this as Emitter).emit("ok", res!); break; case (2): isSuccess = false; errMsg = info.err_msg ?? "Session Expire"; - this.emit("expire", { errMsg }); + (this as Emitter).emit("expire", { errMsg }); break; case (3): isSuccess = false; errMsg = info.err_msg ?? "Unauthorized"; - this.emit("unauthorized", { errMsg }); + (this as Emitter).emit("unauthorized", { errMsg }); break; case (4): isSuccess = false; errMsg = info.err_msg ?? "Error"; - this.emit("error", { errMsg }); + (this as Emitter).emit("error", { errMsg }); break; } - if (!isSuccess) this.emit("no", { errMsg }); - this.emit("done", { errMsg, data: res }); + if (!isSuccess) (this as Emitter).emit("no", { errMsg }); + (this as Emitter).emit("done", { errMsg, data: res }); }); } } diff --git a/miniprogram/core/Api.ts b/miniprogram/core/Api.ts index b83e58c..05111ac 100644 --- a/miniprogram/core/Api.ts +++ b/miniprogram/core/Api.ts @@ -316,7 +316,7 @@ class API< } // 触发数据初始化事件 - this.emit("initData", this.data); + (this as Emitter).emit("initData", this.data); // 重置请求数据 const requestData:IWxRequestOption = this.requestData = { @@ -343,7 +343,7 @@ class API< } // 触发数据解析 - this.emit("parseRequestData", this.data); + (this as Emitter).emit("parseRequestData", this.data); // 数据收集 for (let key in this.params) { @@ -461,18 +461,18 @@ class API< let request = () => { // 触发请求发送事件 - this.emit("request", this.requestData!) + (this as Emitter).emit("request", this.requestData!) wx.request({ ...this.requestData!, success: (e) => { - this.emit("success", e); + (this as Emitter).emit("success", e); }, fail: (e) => { - this.emit("fail", e); + (this as Emitter).emit("fail", e); }, complete: (e) => { - this.emit("complete", e); + (this as Emitter).emit("complete", e); } }); } @@ -490,12 +490,12 @@ class API< // 使用上次请求结果 if (this.policy === RequestPolicy.useLastRequest) { lastAPI.on("success", (e) => { - this.emit("success", e as SuccessCallbackResult); - this.emit("complete", {errMsg: e.errMsg}); + (this as Emitter).emit("success", e as SuccessCallbackResult); + (this as Emitter).emit("complete", {errMsg: e.errMsg}); }); lastAPI.on("fail", (e) => { - this.emit("fail", e); - this.emit("complete", {errMsg: e.errMsg}); + (this as Emitter).emit("fail", e); + (this as Emitter).emit("complete", {errMsg: e.errMsg}); }); } @@ -605,8 +605,8 @@ class API< */ public addFailedCallBack(): this { this.on("fail", (e) => { - this.emit("no", e as any); - this.emit("done", e as any); + (this as Emitter).emit("no", e as any); + (this as Emitter).emit("done", e as any); }); return this; } diff --git a/miniprogram/modular/Mask/Mask.ts b/miniprogram/modular/Mask/Mask.ts index 692cac0..a873865 100644 --- a/miniprogram/modular/Mask/Mask.ts +++ b/miniprogram/modular/Mask/Mask.ts @@ -106,8 +106,8 @@ class Mask extends Modular { * 处理蒙版点击事件 */ private handleClickMask() { - if (this.autoCloseOnClick) this.emit("hide", void 0); - this.emit("click", void 0); + if (this.autoCloseOnClick) this.emit("hide"); + this.emit("click"); } } diff --git a/miniprogram/pages/Account/Account.ts b/miniprogram/pages/Account/Account.ts index 8fd3723..3751888 100644 --- a/miniprogram/pages/Account/Account.ts +++ b/miniprogram/pages/Account/Account.ts @@ -10,10 +10,10 @@ import { Mask } from "../../modular/Mask/Mask"; const { manager, query } = await Manager.PageAsync(); // 添加蒙版 Modular - const mask = manager.addModule(Mask, "mask"); + // const mask = manager.addModule(Mask, "mask"); // 添加 UserCard Modular - manager.addModule(UserCard, "userCard", { mask }); + manager.addModule(UserCard, "userCard"); // 添加 MainFunction Modular manager.addModule(MainFunction, "mainFunction"); diff --git a/miniprogram/pages/Account/UserCard.ts b/miniprogram/pages/Account/UserCard.ts index aa67f22..e1c5a41 100644 --- a/miniprogram/pages/Account/UserCard.ts +++ b/miniprogram/pages/Account/UserCard.ts @@ -2,7 +2,7 @@ import { Modular, Manager } from "../../core/Module"; import { Mask } from "../../modular/Mask/Mask"; type IUserCardDependent = { - mask: Mask + // mask: Mask } type IUserCardEvent = { @@ -23,7 +23,7 @@ class UserCard extends Modular, IUse * 处理主题更换 */ private handleChangeTheme() { - this.depends?.mask.emit("show", void 0); + // this.depends?.mask.emit("show", void 0); this.emit("clickChangeTheme", void 0); } } From 292a4c26c5bbc993766ca8424a77343a3f25646e Mon Sep 17 00:00:00 2001 From: mrkbear Date: Sat, 22 Jan 2022 17:50:25 +0800 Subject: [PATCH 2/3] (#60) Core emitter generic optimization --- miniprogram/pages/Account/UserCard.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/miniprogram/pages/Account/UserCard.ts b/miniprogram/pages/Account/UserCard.ts index e1c5a41..f6c54f8 100644 --- a/miniprogram/pages/Account/UserCard.ts +++ b/miniprogram/pages/Account/UserCard.ts @@ -24,7 +24,7 @@ class UserCard extends Modular, IUse */ private handleChangeTheme() { // this.depends?.mask.emit("show", void 0); - this.emit("clickChangeTheme", void 0); + this.emit("clickChangeTheme"); } } From 464a9d3e59974d51a29ef3b896a521a63ee8aa2f Mon Sep 17 00:00:00 2001 From: mrkbear Date: Sun, 23 Jan 2022 12:08:38 +0800 Subject: [PATCH 3/3] (#60) Remove mixin generic paradigm. --- miniprogram/core/Api.ts | 13 ++----------- miniprogram/core/Emitter.ts | 13 ++++++++++++- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/miniprogram/core/Api.ts b/miniprogram/core/Api.ts index 05111ac..1105471 100644 --- a/miniprogram/core/Api.ts +++ b/miniprogram/core/Api.ts @@ -1,4 +1,4 @@ -import { Emitter, EventType } from "./Emitter"; +import { Emitter, EventType, EventMixin } from "./Emitter"; import { API_FAILED_SHOW_MESSAGE } from "./Config"; import { Logger, LogLabel, LevelLogLabel, colorRadio, StatusLabel } from "./Logger"; interface IAppAPIParam { @@ -156,16 +156,7 @@ class API< O extends IAnyData = IAnyData, E extends Record = Record, U extends IAnyData = IAnyData -> extends Emitter < - { - // 这个复杂的泛型是为了 MixIn 用户自定义事件类型 - // 懂得如何使用就可以了 - // 不要试图去理解下面这三行代码,真正的恶魔在等着你 - [P in (keyof (IAPIEvent & IAPIResultEvent) | keyof E)] : - P extends keyof IAPIEvent ? IAPIEvent[P] : - P extends keyof IAPIResultEvent ? IAPIResultEvent[P] : E[P] - } -> { +> extends Emitter & IAPIResultEvent, E>> { /** * 默认调试标签 diff --git a/miniprogram/core/Emitter.ts b/miniprogram/core/Emitter.ts index c649a83..1bfd2a7 100644 --- a/miniprogram/core/Emitter.ts +++ b/miniprogram/core/Emitter.ts @@ -15,7 +15,18 @@ export type EventHandlerMap> = Map< // Emitter function type type IEmitParamType, K extends keyof E> = - E[K] extends ( undefined | void ) ? [K] : [K, E[K]]; + E[K] extends ( undefined | void ) ? [type: K] : [type: K, evt: E[K]]; + +// Mixin to event object +export type EventMixin, B extends Record> = { + [P in (keyof A | keyof B)] : + P extends (keyof A & keyof B) ? + A[P] : + P extends keyof A ? + A[P] : + P extends keyof B ? B[P] : + never; +} export class Emitter> {