使用型变实现类型安全的事件发射器
利用协变与逆变的型变规则,构建一个支持emit和on方法且事件类型与回调参数完全匹配的事件系统。 · 难度:入门 · +10XP
使用型变实现类型安全的事件发射器
事件发射器的核心难点在于不同类型的事件携带不同的参数列表。本教程将利用映射类型和函数类型的逆变性质,实现一个类型安全的事件系统:on方法注册的回调参数类型必须与emit发出的参数类型一致。同时展示如何利用逆变/协变规则确保子事件类型的兼容性。
type EventMap = {
data: [id: number, name: string];
error: [code: number, message: string];
end: [];
};
class TypedEmitter<T extends Record<string, any[]>> {
private listeners = new Map<keyof T, Function[]>();
on<E extends keyof T>(event: E, callback: (...args: T[E]) => void): void {
// 逆变:回调参数类型必须更宽或相同
}
emit<E extends keyof T>(event: E, ...args: T[E]): void {
// 协变:发出参数必须精确匹配
}
}