Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.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 为什么需要在RxJs中导入运算符?_Javascript_Typescript_Rxjs - Fatal编程技术网

Javascript 为什么需要在RxJs中导入运算符?

Javascript 为什么需要在RxJs中导入运算符?,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,在学习角度教程时,我发现: import 'rxjs/add/operator/switchMap'; export class HeroDetailComponent implements OnInit { ngOnInit(): void { this.route.paramMap .switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id'))) .subsc

在学习角度教程时,我发现:

import 'rxjs/add/operator/switchMap';

export class HeroDetailComponent implements OnInit {
  ngOnInit(): void {
    this.route.paramMap
      .switchMap((params: ParamMap) => this.heroService.getHero(+params.get('id')))
      .subscribe(hero => this.hero = hero);
  }
}
很抱歉,如果我觉得这有点奇怪(原因有二:我来自Java,并没有真正了解最新的JS技术)。
switchMap
不是属于
param-map
的方法吗,它是
可观察的
?当我删除import语句时,代码不会编译

我使用RxJava,但是操作可观察对象所需的所有方法都已经存在(附加)了可观察对象类本身


有人能告诉我为什么需要导入
switchMap
?可能的话,给我一些参考链接。

你可以阅读这篇文章:

至少有很多操作员失踪。但这不是错误,这是故意的。Angular不会提供所有可用的操作符。这将导致额外的300 kb。因此,要获得具有更多运算符的可观测值,可以导入所需的运算符,也可以导入所有运算符

在构建web应用程序时,应使用较少的http请求,
为了获得更好的性能,您应该压缩文件大小。

您可以阅读本文:

至少有很多操作员失踪。但这不是错误,这是故意的。Angular不会提供所有可用的操作符。这将导致额外的300 kb。因此,要获得具有更多运算符的可观测值,可以导入所需的运算符,也可以导入所有运算符

在构建web应用程序时,应使用较少的http请求,
为了获得更好的性能,您应该压缩文件大小。

如果深入查看
节点模块
文件夹中的源文件,可能会帮助您理解。当您导入
switchMap
时,您的类型脚本加载
switchMap.d.ts
,但编译的javascript加载
switchMap.js

switchMap.d.ts
有一个可观察接口的声明,但是当您定义一个与现有接口同名的接口时,typescript将合并这两个接口定义。因此,在编译时导入所做的一切就是使用
可观察的
使新的
开关映射
方法对任何对象都可访问:

import { switchMap } from '../../operator/switchMap';
declare module '../../Observable' {
    interface Observable<T> {
        switchMap: typeof switchMap;
    }
}

当然,您不必直接导入
switchMap
来显示它,如果程序中有任何代码导入它,那么
switchMap
方法将在运行时存在,但是,如果您没有导入
类型脚本,它将试图阻止您使用它。

如果您深入查看
节点模块
文件夹中的源文件,它可能会帮助您理解。当您导入
switchMap
时,您的类型脚本加载
switchMap.d.ts
,但编译的javascript加载
switchMap.js

switchMap.d.ts
有一个可观察接口的声明
,但是当您定义一个与现有接口同名的接口时,typescript将合并这两个接口定义。因此,在编译时导入所做的一切就是使用
可观察的
使新的
开关映射
方法对任何对象都可访问:

import { switchMap } from '../../operator/switchMap';
declare module '../../Observable' {
    interface Observable<T> {
        switchMap: typeof switchMap;
    }
}

当然,您不必直接导入
switchMap
,如果程序中有任何代码导入它,那么
switchMap
方法将在运行时存在,但是如果您没有
import
typescript,则会试图阻止您使用它。

因为RxJs是功能性的,我不明白为什么
paramMap
会“拥有”
switchMap
。检查他们文档中的示例用法。我在面向对象编程中的理解是,如果一个对象后面跟点(.),那么就用curl表示,例如
rectangle.calcrea()
,然后,应该将
calcArea
函数定义为
矩形中的一个函数/方法。因为加载所有rxjs库非常大(这将是低效的,页面的呈现速度会很慢)。因此,最好只导入您需要的内容,在您的示例中,您需要switchMap,所以您只需要导入switchMap函数(不是rxjs的所有函数)。在Java中,您不需要关心它,整个库都被导入到您的项目中。@sancho21是的,但是如果没有导入,该方法就不存在。导入添加了该方法。由于RxJs是功能性的,我不明白为什么
paramMap
会“拥有”
switchMap
。检查他们文档中的示例用法。我在面向对象编程中理解的是,如果一个对象后跟点(.),那么就用curl表示,例如
rectangle.calcrea()
,然后,应该将
calcArea
函数定义为
矩形中的一个函数/方法。因为加载所有rxjs库非常大(这将是低效的,页面的呈现速度会很慢)。因此,最好只导入您需要的内容,在您的示例中,您需要switchMap,所以您只需要导入switchMap函数(不是rxjs的所有函数)。在Java中,您不需要关心它,整个库都被导入到您的项目中。@sancho21是的,但是如果没有导入,该方法就不存在。导入将添加该方法。