Typescript:Map< >与strictNullChecks的用法

qpgpyjmq  于 2023-05-30  发布在  TypeScript
关注(0)|答案(2)|浏览(130)

下面是一个简单的类:

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中,启用了标志strictNullChecksstrict
尽管subscribers被检查为当前事件的键,但typescript编译器仍会报告上面显示的错误消息(this.subscribers.get(event)可能未定义)。
如果我没有完全错的话,在这种情况下,this.subscribers.get(event)永远不可能是undefined
我怎样才能摆脱这条信息?

nwsw7zdq

nwsw7zdq1#

键入Map明确指出get可以导致undefined

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

这就是为什么你在启用strictNullChecks时出错的原因。
你可以使用非空Assert操作符来通知编译器你确定它实际上有值:

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

f2uvfpb92#

为什么不写一个新的接口/类,不允许未定义的值?

interface StrictMap<K, V> {
    ...
    get(key: K): V /* `| undefined` -> main diff. with `Map` native interface: The values can't be undefined */;
    ...
}

PS:事实上,当我发现这个SO帖子时,我正在搜索这样的接口/类;)

相关问题