【问题标题】:How to properly handle type for es6 Map<K,V> functions when using Typescript?使用 Typescript 时如何正确处理 es6 Map<K,V> 函数的类型?
【发布时间】:2021-04-28 14:24:45
【问题描述】:

我有这样的课:

export class Broker<T> implements BrokerContract<T> {

  topicToSubscribersMap: Map<string, Set<Subscriber<T>>>;
                            .
                            .
                            .

  public registerSubscriber(topic: string, subscriber: Subscriber<T>): void {

        if (this.topicToSubscribersMap.get(topic)) {
            let currentSubscribers: Set<Subscriber<T>> = this.topicToSubscribersMap.get(topic);
        }
  }


                           .
                           .
}




在函数registerSubscriber 中,当我尝试从地图中获取值时,Typescript 抱怨我们无法将V | undefined 的类型分配给V,因为Map 上的get 方法返回V | undefined

现在,我知道我可以做到这一点 -

let currentSubscribers: Set<Subscriber<T>> = <Set<Subscriber<T>>>this.topicToSubscribersMap.get(topic);

或者这个-

let currentSubscribers: Set<Subscriber<T>> = this.topicToSubscribersMap.get(topic) as Set<Subscriber<T>>;

但我担心的是,当我已经在封闭的if 条件中检查undefined 时,为什么还要这样做?

另外,由于这是 Mapget 方法的签名本身以返回 V | undefined 类型,并且假设这种情况通常最常出现 - 处理它的最佳方法是什么?

【问题讨论】:

    标签: javascript typescript types typescript-typings


    【解决方案1】:

    TypeScript 不够聪明,无法缩小函数调用的结果,因为调用被假定为非纯调用(即,它可能在具有相同参数的后续调用中返回不同的值)

    如果你先给一个变量赋值:

    const topic = this.topicToSubscribersMap.get(topic);
    if (topic){
        // topic is narrowed to Set<Subscriber<T>>
    }
    

    【讨论】:

    • 在您的示例中,我们从函数调用的返回类型推断类型。如果我们想预先用某些类型声明所有这些变量,以确保它们得到我们期望的结果怎么办?
    猜你喜欢
    • 2022-11-30
    • 2016-12-23
    • 2011-07-31
    • 2021-06-17
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2020-04-08
    • 2019-08-03
    相关资源
    最近更新 更多