gpt4 book ai didi

typescript - TypeScript 是否支持类事件?

转载 作者:搜寻专家 更新时间:2023-10-30 20:29:02 24 4
gpt4 key购买 nike

我只是想知道在 TypeScript 中是否可以在类或接口(interface)上定义自定义事件?

这会是什么样子?

最佳答案

将这个简化的事件用作属性怎么样?拥有类的强类型且无继承要求:

interface ILiteEvent<T> {
on(handler: { (data?: T): void }) : void;
off(handler: { (data?: T): void }) : void;
}

class LiteEvent<T> implements ILiteEvent<T> {
private handlers: { (data?: T): void; }[] = [];

public on(handler: { (data?: T): void }) : void {
this.handlers.push(handler);
}

public off(handler: { (data?: T): void }) : void {
this.handlers = this.handlers.filter(h => h !== handler);
}

public trigger(data?: T) {
this.handlers.slice(0).forEach(h => h(data));
}

public expose() : ILiteEvent<T> {
return this;
}
}

这样使用:

class Security{
private readonly onLogin = new LiteEvent<string>();
private readonly onLogout = new LiteEvent<void>();

public get LoggedIn() { return this.onLogin.expose(); }
public get LoggedOut() { return this.onLogout.expose(); }

// ... onLogin.trigger('bob');
}

function Init() {
var security = new Security();

var loggedOut = () => { /* ... */ }

security.LoggedIn.on((username?) => { /* ... */ });
security.LoggedOut.on(loggedOut);

// ...

security.LoggedOut.off(loggedOut);
}

改进?

A gist for this

关于typescript - TypeScript 是否支持类事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12881212/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com