优化强类型事件类型

This commit is contained in:
dgflash
2026-04-05 10:00:53 +08:00
parent 421c7db39e
commit 79d5ee8637
9 changed files with 104 additions and 97 deletions

View File

@@ -1,27 +1,7 @@
import { log, warn } from 'cc';
import type { ListenerFunc, ListenerFuncTyped } from './EventMessage';
import { EventData } from './EventData';
import { EventDataPool } from './EventDataPool';
/**
* 全局事件类型映射接口
* 业务层可以通过 declare module 扩展此接口来定义强类型事件
*
* @example
* // 在业务代码中扩展
* declare module 'db://oops-framework/core/common/event/MessageManager' {
* interface TypedEventMap {
* [YourEvent.SomeEvent]: { data: string };
* }
* }
*/
export interface TypedEventMap {
// 业务层通过 declare module 扩展此接口
}
/** 获取 TypedEventMap 中所有事件 key 的联合类型 */
export type EventMapKeys = keyof TypedEventMap;
import type { ListenerFunc, ListenerFuncTyped } from './EventMessage';
/**
* 全局消息管理
@@ -53,7 +33,7 @@ export class MessageManager {
* @param listener 处理事件的侦听器函数
* @param object 侦听函数绑定的作用域对象
*/
watch<K extends keyof TypedEventMap>(event: K, listener: ListenerFuncTyped<K, TypedEventMap[K]>, object: object): void {
watch<K extends keyof OopsFramework.TypedEventMap>(event: K, listener: ListenerFuncTyped<K, OopsFramework.TypedEventMap[K]>, object: object): void {
this.on(event as string, listener as ListenerFunc, object);
}
@@ -63,7 +43,7 @@ export class MessageManager {
* @param listener 事件触发回调方法
* @param object 侦听函数绑定的作用域对象
*/
watchOnce<K extends keyof TypedEventMap>(event: K, listener: ListenerFuncTyped<K, TypedEventMap[K]>, object: object): void {
watchOnce<K extends keyof OopsFramework.TypedEventMap>(event: K, listener: ListenerFuncTyped<K, OopsFramework.TypedEventMap[K]>, object: object): void {
this.once(event as string, listener as ListenerFunc, object);
}
@@ -73,7 +53,7 @@ export class MessageManager {
* @param listener 处理事件的侦听器函数(可选,不传则移除该事件的所有监听器)
* @param object 侦听函数绑定的作用域对象(可选)
*/
unwatch<K extends keyof TypedEventMap>(event: K, listener?: ListenerFuncTyped<K, TypedEventMap[K]>, object?: object): void {
unwatch<K extends keyof OopsFramework.TypedEventMap>(event: K, listener?: ListenerFuncTyped<K, OopsFramework.TypedEventMap[K]>, object?: object): void {
this.off(event as string, listener as ListenerFunc, object);
}
@@ -83,7 +63,7 @@ export class MessageManager {
* @param data 事件数据(必须完全匹配类型定义)
* @note 使用此方法可获得编译时的强类型约束,参数不匹配会编译报错
*/
emit<K extends keyof TypedEventMap>(event: K, data: TypedEventMap[K]): void {
emit<K extends keyof OopsFramework.TypedEventMap>(event: K, data: OopsFramework.TypedEventMap[K]): void {
const list = this.events.get(event as string);
if (list != null) {
const eds: Array<EventData> = list.concat();
@@ -101,7 +81,7 @@ export class MessageManager {
* @param data 事件数据(必须完全匹配类型定义)
* @note 使用此方法可获得编译时的强类型约束,参数不匹配会编译报错
*/
emitAsync<K extends keyof TypedEventMap>(event: K, data: TypedEventMap[K]): Promise<void> {
emitAsync<K extends keyof OopsFramework.TypedEventMap>(event: K, data: OopsFramework.TypedEventMap[K]): Promise<void> {
return new Promise((resolve) => {
const list = this.events.get(event as string);
if (list != null) {

View File

@@ -9,7 +9,7 @@ import { director, isValid } from 'cc';
import { GameComponent } from '../../module/common/GameComponent';
import { resLoader } from '../common/loader/ResLoader';
import { ViewUtil } from '../utils/ViewUtil';
import { View } from '../../types/Types';
import { View } from '../../types/Module';
/** 游戏元素打开参数 */
export interface ElementParams {

View File

@@ -1,4 +1,4 @@
import type { GameComponentCtor, UICtor } from '../../types/Types';
import type { GameComponentCtor, UICtor } from '../../types/Module';
import type { UIConfigMap } from './layer/LayerEnum';
import type { UIConfig } from './layer/UIConfig';

View File

@@ -7,7 +7,7 @@ import { ViewUtil } from '../../core/utils/ViewUtil';
import { ecs } from '../../libs/ecs/ECS';
import type { ECSEntity } from '../../libs/ecs/ECSEntity';
import type { CompType } from '../../libs/ecs/ECSModel';
import type { BusinessCtor, EntityCtor, UICtor, View, ViewCtor } from '../../types/Types';
import type { BusinessCtor, EntityCtor, UICtor, View, ViewCtor } from '../../types/Module';
import type { CCBusiness } from './CCBusiness';
import { GameComponent } from './GameComponent';

View File

@@ -11,7 +11,7 @@ import { ECSModel } from '../../libs/ecs/ECSModel';
import { VM } from '../../libs/model-view/ViewModel';
import { VMBase } from '../../libs/model-view/VMBase';
import type { CCEntity } from './CCEntity';
import type { UICtor } from '../../types/Types';
import type { UICtor } from '../../types/Module';
import { GameComponent } from './GameComponent';
/**

View File

@@ -12,10 +12,10 @@ import type { IAudioParams } from '../../core/common/audio/IAudio';
import { EventDispatcher } from '../../core/common/event/EventDispatcher';
import type { ListenerFunc, ListenerFuncTyped } from '../../core/common/event/EventMessage';
import { EventMessage } from '../../core/common/event/EventMessage';
import type { TypedEventMap } from '../../core/common/event/MessageManager';
import type { AssetType, CompleteCallback, Paths, ProgressCallback } from '../../core/common/loader/ResLoader';
import { resLoader } from '../../core/common/loader/ResLoader';
import { ViewUtil } from '../../core/utils/ViewUtil';
import type { EventMapKeys } from '../../types/Event';
const { ccclass } = _decorator;
@@ -57,27 +57,16 @@ export class GameComponent extends Component {
/** 标记是否已注册按钮事件 */
private _buttonEnabled = false;
//#region 强类型事件方法(提供给 Agent 自动生成用)
/**
* 注册全局事件(强类型)
* @param event 事件名(枚举)
* @param listener 处理事件的侦听器函数
* @param object 侦听函数绑定的this对象
*/
on<K extends keyof TypedEventMap>(event: K, listener: ListenerFuncTyped<K, TypedEventMap[K]>, object: any): void;
/**
* 注册全局事件(兼容旧用法)
* @param event 事件名
* @param listener 处理事件的侦听器函数
* @param object 侦听函数绑定的this对象
*/
on(event: string, listener: ListenerFunc, object: any): void;
/**
* 注册全局事件(实现)
*/
on(event: string, listener: ListenerFunc, object: any): void {
this.event.on(event, listener, object);
watch<K extends keyof OopsFramework.TypedEventMap>(event: K, listener: ListenerFuncTyped<K, OopsFramework.TypedEventMap[K]>, object: any): void {
this.event.on(event as string, listener as ListenerFunc, object);
}
/**
@@ -86,60 +75,18 @@ export class GameComponent extends Component {
* @param listener 事件触发回调方法
* @param object 侦听函数绑定的this对象
*/
once<K extends keyof TypedEventMap>(event: K, listener: ListenerFuncTyped<K, TypedEventMap[K]>, object: any): void;
/**
* 监听一次事件,事件响应后,该监听自动移除(兼容旧用法)
* @param event 事件名
* @param listener 事件触发回调方法
* @param object 侦听函数绑定的this对象
*/
once(event: string, listener: ListenerFunc, object: any): void;
/**
* 监听一次事件,事件响应后,该监听自动移除(实现)
*/
once(event: string, listener: ListenerFunc, object: any): void {
this.event.once(event, listener, object);
watchOnce<K extends keyof OopsFramework.TypedEventMap>(event: K, listener: ListenerFuncTyped<K, OopsFramework.TypedEventMap[K]>, object: any): void {
this.event.once(event as string, listener as ListenerFunc, object);
}
/**
* 移除全局事件(强类型)
* @param event 事件名(枚举)
* @param listener 处理事件的侦听器函数(可选)
* @param object 侦听函数绑定的this对象可选
*/
off<K extends keyof TypedEventMap>(event: K): void;
/**
* 移除全局事件(兼容旧用法)
* @param event 事件名
*/
off(event: string): void;
/**
* 移除全局事件(实现)
*/
off(event: string): void {
this.event.off(event);
}
/**
* 触发全局事件(兼容旧用法)
* @param event 事件名
* @param args 事件参数
*/
dispatchEvent(event: string, ...args: any[]): void {
this.event.dispatchEvent(event, ...args);
}
/**
* 触发全局事件,支持同步与异步处理(兼容旧用法)
* @param event 事件名
* @param args 事件参数
*/
dispatchEventAsync(event: string, ...args: any[]): Promise<void> {
return this.event.dispatchEventAsync(event, ...args);
unwatch<K extends keyof OopsFramework.TypedEventMap>(event: K, listener?: ListenerFuncTyped<K, OopsFramework.TypedEventMap[K]>, object?: any): void {
this.event.off(event as string, listener as ListenerFunc, object);
}
/**
@@ -147,7 +94,7 @@ export class GameComponent extends Component {
* @param event 事件名(枚举)
* @param data 事件数据
*/
emit<K extends keyof TypedEventMap>(event: K, data: TypedEventMap[K]): void {
emit<K extends keyof OopsFramework.TypedEventMap>(event: K, data: OopsFramework.TypedEventMap[K]): void {
this.event.emit(event, data);
}
@@ -156,9 +103,62 @@ export class GameComponent extends Component {
* @param event 事件名(枚举)
* @param data 事件数据(必须完全匹配类型定义)
*/
emitAsync<K extends keyof TypedEventMap>(event: K, data: TypedEventMap[K]): Promise<void> {
emitAsync<K extends keyof OopsFramework.TypedEventMap>(event: K, data: OopsFramework.TypedEventMap[K]): Promise<void> {
return this.event.emitAsync(event, data);
}
//#endregion
//#region 弱类型事件方法
/**
* 注册全局事件
* @param event 事件名
* @param listener 处理事件的侦听器函数
* @param object 侦听函数绑定的this对象
*/
on(event: string, listener: ListenerFunc, object: any): void {
this.event.on(event, listener, object);
}
/**
* 监听一次事件,事件响应后,该监听自动移除
* @param event 事件名
* @param listener 事件触发回调方法
* @param object 侦听函数绑定的this对象
*/
once(event: string, listener: ListenerFunc, object: any): void {
this.event.once(event, listener, object);
}
/**
* 移除全局事件
* @param event 事件名
* @param listener 处理事件的侦听器函数(可选)
* @param object 侦听函数绑定的this对象可选
*/
off(event: string, listener?: ListenerFunc, object?: object): void {
this.event.off(event, listener, object);
}
/**
* 触发全局事件
* @param event 事件名
* @param args 事件参数
*/
dispatchEvent(event: string, ...args: any[]): void {
this.event.dispatchEvent(event, ...args);
}
/**
* 触发全局事件,支持同步与异步处理
* @param event 事件名
* @param args 事件参数
*/
dispatchEventAsync(event: string, ...args: any[]): Promise<void> {
return this.event.dispatchEventAsync(event, ...args);
}
//#endregion
//#endregion
//#region 预制节点管理

View File

@@ -1,5 +1,5 @@
import { resLoader } from '../../core/common/loader/ResLoader';
import { GameComponentCtor } from '../../types/Types';
import { GameComponentCtor } from '../../types/Module';
/**
* 游戏装饰器命名空间

27
assets/types/Event.d.ts vendored Normal file
View File

@@ -0,0 +1,27 @@
/**
* 全局事件类型映射接口
* 业务层可以通过 declare global 扩展 OopsFramework.TypedEventMap 来定义强类型事件
*
* @example
* // 在业务代码中扩展
* declare global {
* namespace OopsFramework {
* interface TypedEventMap {
* [YourEvent.SomeEvent]: { data: string };
* }
* }
* }
*/
declare global {
namespace OopsFramework {
interface TypedEventMap {
// 业务层通过 declare global 扩展此接口
}
}
}
/** 获取 TypedEventMap 中所有事件 key 的联合类型 */
export type EventMapKeys = keyof OopsFramework.TypedEventMap;
export { };