【问题标题】:Typescript: Usage of Map<> with strictNullChecks打字稿:使用 Map<> 和 strictNullChecks
【发布时间】:2017-11-19 11:12:15
【问题描述】:

给定以下简单的类:

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 以获取当前事件的键,但打字稿编译器会抱怨上面显示的错误消息(this.subscribers.get(event) 可能未定义)。

如果我没有完全错,this.subscribers.get(event) 在这种情况下永远不会是undefined

我怎样才能摆脱该消息?

【问题讨论】:

    标签: javascript typescript dictionary strictnullchecks


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-06
      • 2019-12-10
      • 2021-12-03
      • 2016-08-19
      • 2021-10-25
      • 2014-05-30
      • 1970-01-01
      • 2018-09-03
      相关资源
      最近更新 更多