请编写一个类型安全的基于ts的eventbus,且回调里可以加上自定义参数
时间: 2023-06-07 10:10:47 浏览: 169
好的,我可以为您编写一个类型安全的基于 TypeScript 的 EventBus,并且支持在回调函数中添加自定义参数。以下是示例代码:
```typescript
type Handler<T> = (data: T, ...customArgs: any[]) => void;
class EventBus<T> {
private handlers: Handler<T>[] = [];
public subscribe(handler: Handler<T>) {
this.handlers.push(handler);
}
public unsubscribe(handler: Handler<T>) {
this.handlers = this.handlers.filter(h => h !== handler);
}
public emit(data: T, ...customArgs: any[]) {
this.handlers.forEach(handler => handler(data, ...customArgs));
}
}
```
使用示例:
```typescript
interface User {
name: string;
age: number;
}
const userEventBus = new EventBus<User>();
function onUserCreated(user: User, isNewUser: boolean) {
console.log(`User '${user.name}' was created${isNewUser ? " (new)" : ""}`);
}
userEventBus.subscribe(onUserCreated);
const newUser: User = { name: "John Doe", age: 25 };
// ...
// User 'John Doe' was created (new)
userEventBus.emit(newUser, true);
// ...
// User 'John Doe' was created
userEventBus.emit(newUser, false);
userEventBus.unsubscribe(onUserCreated);
```
在这个示例中,我定义了一个 `User` 接口,并创建了一个 `userEventBus` 的实例。然后,我定义了一个名为 `onUserCreated` 的回调函数,它会在 `userEventBus` 触发时被调用。此回调函数具有一个 `User` 类型的参数和一个名为 `isNewUser` 的布尔类型的自定义参数。
我使用 `userEventBus.subscribe` 方法订阅 `onUserCreated` 函数,接着在 `userEventBus.emit` 方法中触发 `onUserCreated` 函数,并同时传递了一个 `true` 布尔类型的值作为自定义参数。 `userEventBus.emit` 方法将调用 `onUserCreated` 并将 `newUser` 对象和自定义参数(值为 `true`)作为参数传递。
阅读全文