如何创建混合模式以使事件在继承层次结构中冒泡?

时间:2018-08-06 02:37:58

标签: typescript events event-handling mixins

我正在编写Angular 6 + NodeJS socket.io应用程序的前端和后端。我使用的是ng6包中的Typescript 2.7,但这个问题纯粹是后端服务器。

是否可以编写mixin模式来在mixin层次结构链中冒泡套接字事件?

下面是所需的伪代码:

interface IEventHandler {
    public handleEvent(eventType:string);
}

class DangerHandler<T extends IEventHandler> extends T implements IEventHandler {
    public handleEvent(eventType:string) {
        if(eventType == 'dangerous') {
            console.log('handled dangerous event');
            return true;
        }
        super.handleEvent(eventType);
    }
}

class SarcasmHandler<T extends IEventHandler> extends T implements IEventHandler {
    public handleEvent(eventType:string) {
        if(eventType == 'sarcastic') {
            console.log('handled sarcastic event');
            return true;
        }
        super().handleEvent(eventType);
    }
}

class Person implements IEventHandler {
    constructor(public name:string) {}
    public handleEvent(eventType:string) {
        console.log('I dont know how to handle events, but my children will handle it') ;
    }
}

var smartPerson = new DangerHandler<SarcasmHandler<Person>>('Jim');
smartPerson.handleEvent('sarcastic');
// --> 'handled sarcastic event'

在上面的示例中,我有一个Person类,它将遇到他必须处理的不同事件,但是他还不知道什么样的事件。

我希望能够创建一个新的Handler mixin来处理发现的新事件。

在此示例中,显示了每个链接的mixin都将覆盖handleEvent,并且如果孙子不能处理该事件,它将使链条向上膨胀到其父级来处理。

如何在TypeScript 2.7或最新版本中实现此模式?

==============

编辑:

好吧,发布此任务后再尝试尝试一下,可以给我以下信息:

class EventHandler {
    public handleEvent(eventType:string):void {
        console.log('to be overriden');
    }
}

class Person extends EventHandler {
    constructor(public name:string){ super(); }
    public handleEvent(eventType:string) {
        console.log('I dont know how to handle, expect children to handle');
    }
}

type Mixin<T extends EventHandler = EventHandler>  = new (...args:any[]) => T;
function DangerHandler<TBase extends Mixin>(Base: TBase) {
    return class extends Base {
        public handleEvent(eventType:string):void {
            if(eventType == 'danger') {
                console.log('danger handled');
            } else {
                super.handleEvent(eventType);
            }
        }
    }
}
function SacarsmHandler<TBase extends Mixin>(Base: TBase) {
    return class extends Base {
        public handleEvent(eventType:string) {
            if(eventType == 'sacarsm') {
                console.log('sacarsm handled');
            } else {
                super.handleEvent(eventType);
            }
        }
    }
}

const SmartPerson = DangerHandler(SacarsmHandler(Person));
var person = new SmartPerson('Jim');
person.handleEvent('danger');
person.handleEvent('sacarsm');
person.handleEvent('embarassment');

但是我不知道这是什么:T扩展了EventHandler = EventHandler type Mixin<T extends EventHandler = EventHandler> = new (...args:any[]) => T;

表示。有人可以解释吗?

此外,如果还有其他更好的方法,请在下面回答。谢谢!

0 个答案:

没有答案