给出以下简单的类:
class Observer {
private subscribers: Map<string, Array<((data: any) => void)>> = new Map();
public subscribe(event: string, callback: (data: any) => void) {
if (!this.subscribers.has(event)) {
this.subscribers.set(event, []);
}
this.subscribers.get(event).push(callback); //tsc says: Object is possibly 'undefined'
}
}
此外,在tsconfig.json中,启用了
strictNullChecks
和strict
标志。尽管已检查
subscribers
以查找当前事件的键,但 typescript 编译器仍会抱怨上面显示的错误消息(this.subscribers.get(event)
可能未定义)。如果我没有完全错,在这种情况下,
this.subscribers.get(event)
永远不能是undefined
。我如何摆脱该信息?
最佳答案
键入Map
会明确指出get
可能会导致undefined
:
interface Map<K, V> {
...
get(key: K): V | undefined;
...
}
这就是为什么在启用strictNullChecks时出错。
您可以使用non-null assertion operator通知编译器您确定它确实有值(value):
this.subscribers.get(event)!.push(callback);
另一个选项(我认为更好的选择)是通过以下方式重构代码:
public subscribe(event: string, callback: (data: any) => void) {
let callbacks = this.subscribers.get(event);
if (!callbacks) {
callbacks = []
this.subscribers.set(event, callbacks);
}
callbacks.push(callback);
}