Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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
angular和rxjs 6中的flatMap类型问题_Angular_Typescript_Intellij Idea_Functional Programming_Rxjs - Fatal编程技术网

angular和rxjs 6中的flatMap类型问题

angular和rxjs 6中的flatMap类型问题,angular,typescript,intellij-idea,functional-programming,rxjs,Angular,Typescript,Intellij Idea,Functional Programming,Rxjs,我正在学习rxjs。我从一个教程下载了这个项目,但有一个类未能编译。我试图纠正它,假设某个库已经进化,但我失败了。我将代码简化到最低限度,但我仍然无法理解为什么会出现错误。这是通过Intellij IDE给出的类型脚本错误 我在下面的第7行得到一个错误: import { flatMap, map } from 'rxjs/operators'; import { Observable, of } from 'rxjs'; export class TestClass { a$ = o

我正在学习rxjs。我从一个教程下载了这个项目,但有一个类未能编译。我试图纠正它,假设某个库已经进化,但我失败了。我将代码简化到最低限度,但我仍然无法理解为什么会出现错误。这是通过Intellij IDE给出的类型脚本错误

我在下面的第7行得到一个错误:

import { flatMap, map } from 'rxjs/operators';
import { Observable, of } from 'rxjs';

export class TestClass {
    a$ = of('dummy').pipe( // Observable<string>
        flatMap(s => of(s)), // Observable<string>
        map<string, string>(s => s) // Observable<string>  <-- ERROR HERE
    );

    b$ = of('dummy').pipe( // Observable<string>
        flatMap(s => of(s)), // Observable<string> or Observable<Observable<string>> ?
        map<Observable<string>, Observable<string>>(os => os)
    );
}
从'rxjs/operators'导入{flatMap,map};
从'rxjs'导入{可观察的};
导出类TestClass{
a$=of('dummy')。管道(//可观察
平面图=>of(s)),//可观察
map(s=>s)//可观察的(s)),//可观察的还是可观察的?
映射(os=>os)
);
}
map()

据我所知,flatMap在输入时有一个
可观察的
,将每个项目
T
映射到一个
可观察的
,flatMap将整个项目展平为
可观察的

但是美元中有一个错误。

b$可以编译。似乎
flatMap
不会将内容展平,并生成一个
可观察的
。下一个
map()

那么到底发生了什么?在
flatMap()?或者我的编译器或IDE发生了一些有趣的事情,我收到了错误的错误消息

更新

最后,typescript出现了一个假错误。 我对函数式编程的理解恢复了信心。

of('dummy')
创建了一个可观察的对象,并将字符串
'dummy'
沿着管道发出。
flatMap
(根据docs是
mergeMap
的别名),将接收上一个操作员/静态方法发送到管道的内容,将其映射到投影仪功能上指定的任何内容,然后将其展平,合并到外部可观察对象(根据docs)

在使用
flatMap(s=>of(s))
的情况下,字符串
'dummy'
将映射到一个可观察对象,并且在返回并发送到管道之前,
flatMap
将其合并到外部可观察对象,因此您没有
可观察对象,只有一个简单的
可观察对象

RxJs操作符需要接收可观测数据,并在管道中返回可观测数据(如果其中一个,如map,不显式返回可观测数据,RxJs会在幕后为您执行此操作)。因此,您最后的
映射将收到一个
可观察的
,如
b$
中所预期的,而不是一个普通的
字符串,如
a$
中所预期的

我解决了我的问题

我对flatMap的理解是正确的,而tslint在这一点上是错误的

升级typescript和tslint(以及其他一些)的版本后,
a$
编译正常,
b$
会导致错误,正如我所预料的那样

我使用的tslint版本似乎存在一些问题,或者可能是与其他库的兼容性问题,导致了错误

作为记录,不起作用的配置包括:

"@angular-devkit/build-angular": "~0.6.8",
"@angular/...": "^6.0.3",
"rxjs": "^6.0.0",
"ts-node": "~5.0.1",
"typescript": "~2.7.2",
"tslint": "~5.9.1"
有效的配置包括:

"@angular-devkit/build-angular": "^0.13.0",
"@angular/...": "^6.1.3",
"rxjs": "6.0.0",
"ts-node": "~7.0.1",
"typescript": "~2.7.0"
"tslint": "~5.11.0",

我的TSLint在
a$
上没有显示错误,但在
b$
上显示错误。您是否尝试重新启动IDE?当你做一些复杂的打字操作时,有时会发生这种情况……谢谢。我曾尝试重新启动IDE并清除node_模块。这没用。然而,通过升级typescript和tslint(以及其他一些)的版本,我现在有了相反的错误,a$通过,b$显示错误。似乎某些版本的tslint存在导致该错误的问题。请不要将已解决的问题添加到您的问题中。请接受现有答案,发布您自己的答案,或者删除无法复制的问题。谢谢您的解释。但是,由于flatMap中的函数已经返回了一个可观测值,因此没有理由将其包装在一个新函数中。正如我在另一篇评论中所说,在升级了一些软件包之后,错误消失了。但你的解释揭示了可能发生的事情。不知何故,typescript没有识别出flatMap中函数的返回类型是可观察的,所以它将结果包装成了一个。