打字稿:使用 Map<> with strictNullChecks
Typescript: Usage of Map<> with strictNullChecks
给出以下简单的 class:
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
被检查为当前事件的键,打字稿编译器抱怨上面显示的错误消息(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 来通知编译器您确定它确实具有值:
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);
}
给出以下简单的 class:
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
被检查为当前事件的键,打字稿编译器抱怨上面显示的错误消息(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 来通知编译器您确定它确实具有值:
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);
}