angular和rxjs 6中的flatMap类型问题
我正在学习rxjs。我从一个教程下载了这个项目,但有一个类未能编译。我试图纠正它,假设某个库已经进化,但我失败了。我将代码简化到最低限度,但我仍然无法理解为什么会出现错误。这是通过Intellij IDE给出的类型脚本错误 我在下面的第7行得到一个错误: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
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中函数的返回类型是可观察的,所以它将结果包装成了一个。