我正在编写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;
表示。有人可以解释吗?
此外,如果还有其他更好的方法,请在下面回答。谢谢!