TSLint 提到通用处理程序的问题

TSLint mentions problems with generic Handler

我使用事件调度程序在 TypeScript 的 类 中注册和触发事件。该代码工作正常。为了获得更好的代码质量,我使用了 TSLint,它对我声明处理程序的方式不满意,但我不理解描述。

代码片段:

export type Handler<E> = (event: E) => void;

export class EventDispatcher<E> {
    private handlers: Handler<E>[] = [];

    public fire(event: E) {
        for (const h of this.handlers) {
            h(event);
        }
    }

    public register(handler: Handler<E>) {
        this.handlers.push(handler);
    }
}

TSLint 对代码中的第 4 行不满意,特别是 Handler<E>[]。消息是:

[tslint] Array type using 'T[]' is forbidden for non-simple types. Use 'Array' instead. (array-type) [tslint] Array type using 'T[]' is forbidden for non-simple types. Use 'Array' instead. type Handler = (event: E) => void

我不完全理解 TSLint 要我做什么。为什么 T 被禁止?非简单类型是什么意思?它还说我应该改用数组,但是 Handler<E>[] 已经是一个数组。那么哪里有问题呢?

非简单类型的数组难以阅读。考虑一个变量定义为:

let foo: { prop1: string; prop2: string;}[]

这样的日志项类型可能很容易漏掉末尾的[]。即使在您的情况下,由于数组的项目是泛型类型,也可能很容易在 <..>.

之后的末尾错过 []

linter 希望您使用数组的长形式,通用 Array<T> 类型。这两种形式是完全等价的,所以这只是一个可读性问题。在你的情况下,这应该有效

export type Handler<E> = (event: E) => void;

export class EventDispatcher<E> {
    private handlers: Array<Handler<E>> = [];

    public fire(event: E) {
        for (const h of this.handlers) {
            h(event);
        }
    }

    public register(handler: Handler<E>) {
        this.handlers.push(handler);
    }
}