Typescript: 使用Map<>和strictNullChecks的方法

8

给定以下简单类:

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。
我该如何消除这个消息?
2个回答

21

Map中显式地使用类型说明,可以表明get可能返回undefined

interface Map<K, V> {
    ...
    get(key: K): V | undefined;
    ...
}

启用strictNullChecks选项后,这就是为什么您会出现错误的原因。

您可以使用非空断言运算符来告知编译器您确定它实际上具有值:

非空断言运算符

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);
}

0
为什么不编写一个新的接口/类,不容忍未定义的值呢?
interface StrictMap<K, V> {
    ...
    get(key: K): V /* `| undefined` -> main diff. with `Map` native interface: The values can't be undefined */;
    ...
}

PS:实际上,我在找这样的接口/类时发现了这个SO帖子;)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接