TSLint упоминает проблемы с универсальным обработчиком - PullRequest
0 голосов
/ 13 ноября 2018

Я использую диспетчер событий для регистрации и запуска событий внутри классов в 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] Тип массива с использованием 'T []' запрещен для непростых типов. использование «Массив» вместо. (тип-массива) [tslint] Тип массива с использованием 'T []' запрещено для непростых типов. Вместо этого используйте «Массив». тип Обработчик = (событие: E) => void

Я не до конца понимаю, чего от меня хочет TSLint. Почему T запрещено? Что подразумевается под непростым типом? Это также говорит о том, что я должен использовать вместо этого массив, но Handler<E>[] уже является массивом. Так в чем же проблема?

1 Ответ

0 голосов
/ 13 ноября 2018

Массивы непростых типов трудно читать.Рассмотрим переменную, определенную как:

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

Может быть легко пропустить [] в конце с таким типом элемента журнала.Даже в вашем случае, поскольку элемент массива является универсальным типом, может быть легко пропустить [] в конце после <..>.

Линтер хочет, чтобы вы использовали длинную форму массиваобщий тип 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);
    }
}
...