Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何正确处理es6 Map的类型<;K、 V>;使用Typescript时的函数?_Javascript_Typescript_Types_Typescript Typings - Fatal编程技术网

Javascript 如何正确处理es6 Map的类型<;K、 V>;使用Typescript时的函数?

Javascript 如何正确处理es6 Map的类型<;K、 V>;使用Typescript时的函数?,javascript,typescript,types,typescript-typings,Javascript,Typescript,Types,Typescript Typings,我有一门课是这样的: export class Broker<T> implements BrokerContract<T> { topicToSubscribersMap: Map<string, Set<Subscriber<T>>>; . . . pub

我有一门课是这样的:

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


                           .
                           .
}




还是这个-

let currentSubscribers: Set<Subscriber<T>> = this.topicToSubscribersMap.get(topic) as Set<Subscriber<T>>;
let currentSubscribers:Set=this.topicToSubscribersMap.get(主题)为Set;
但我关心的是,为什么在我已经检查所附
if
条件中的
undefined
时还需要这样做


另外,由于这是
get
方法的签名本身,该方法使用
Map
返回
V | undefined
类型,假设这种情况通常最常见-处理它的最佳方法是什么?

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

如果您先指定一个变量:

const topic = this.topicToSubscribersMap.get(topic);
if (topic){
    // topic is narrowed to Set<Subscriber<T>>
}
const topic=this.topicToSubscribersMap.get(主题);
如果(主题){
//话题缩小到了设定的范围
}

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

如果您先指定一个变量:

const topic = this.topicToSubscribersMap.get(topic);
if (topic){
    // topic is narrowed to Set<Subscriber<T>>
}
const topic=this.topicToSubscribersMap.get(主题);
如果(主题){
//话题缩小到了设定的范围
}

在您的示例中,我们从函数调用的返回类型推断类型。如果我们想在使用某些类型之前声明所有这些变量,以确保它们得到我们期望的结果,该怎么办?在您的示例中,我们是从函数调用的返回类型推断类型。如果我们想在使用某些类型之前声明所有这些变量,以确保它们得到我们期望的结果,该怎么办?