typescript mixin的发射器(观察者模式)实现,用TypeScript编写。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typescript mixin的发射器(观察者模式)实现,用TypeScript编写。相关的知识,希望对你有一定的参考价值。
// An emitter implementation to mixin.
//
// This file is in the public domain.
//
// Usage:
//
// import Emittable from "...";
//
// class MyEmitter implements Emittable {
// on = Emittable.on;
// off = Emittable.off;
// emit = Emittable.emit;
// }
//
// let emitter = new MyEmitter;
// emitter.on('foo', () => { console.log('emitted!'); });
// emitter.emit('foo');
interface Listener {
(...args: any[]): void;
}
interface EmitMethod {
(type: string, ...args: any[]): void;
}
interface InternalEmitMethod extends EmitMethod {
listenersMap: { [type: string]: Listener[] };
}
interface Emittable {
on(type: string, listener: Listener): void;
off(type: string, listener: Listener): void;
emit: EmitMethod;
}
let Emittable: Emittable = {
on(type: string, listener: Listener): void {
let listenersMap = (<InternalEmitMethod>this.emit).listenersMap;
let listeners = listenersMap[type] || (listenersMap[type] = []);
if (listeners.indexOf(listener) >= 0) return;
listeners.push(listener);
},
off(type: string, listener: Listener): void {
let listeners = (<InternalEmitMethod>this.emit).listenersMap[type];
if (!listeners) return;
let index = listeners.indexOf(listener);
if (index < 0) return;
listeners.splice(index, 1);
},
get emit(): EmitMethod {
let emit = <InternalEmitMethod>function (type: string, ...args: any[]): void {
let listeners = emit.listenersMap[type];
if (!listeners) return;
for (let listener of listeners.concat()) {
listener.apply(null, args);
}
}
emit.listenersMap = {};
return emit;
},
};
export default Emittable;
以上是关于typescript mixin的发射器(观察者模式)实现,用TypeScript编写。的主要内容,如果未能解决你的问题,请参考以下文章
使用组件属性的 Mixin(Vue 2、TypeScript)
typescript TypeScript Class Mixin
TypeScript 中的 Mixin
Typescript:如何在实例成员属性(mixin)中使用方法装饰器?
LayaBox---TypeScript---Mixins
text Mixin,观察者模式实现