我使用事件分派器在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)=>无效
我不完全理解TSLint要我做什么。为什么T
被禁止?非简单类型是什么意思?它还说我应该改用数组,但是Handler<E>[]
已经是数组。那哪里有问题呢?
答案 0 :(得分:1)
很难读取非简单类型的数组。考虑定义为:
的变量let foo: { prop1: string; prop2: string;}[]
使用这样的日志项目类型可能很容易错过最后的[]
。即使在您的情况下,由于数组的项是通用类型,也可能很容易在[]
之后的末尾错过<..>
。
lint希望您使用长格式的数组,即通用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);
}
}