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,观察者模式实现