今天我从角度6升级到7
与此同时,我不得不将rxjs从6.1.0升级到6.3.3,将打字稿从2.7.2升级到3.1.1
现在这个ngrx效果方法抛出了一个打字稿错误:
@Effect()
init$ = defer(() => {
const userData = localStorage.getItem('user');
return (userData)
? of(new Login(JSON.parse(userData)))
: of(new Logout());
});
Run Code Online (Sandbox Code Playgroud)
类型'()=> Observable |的参数 Observable'不能赋值给'()=> void |类型的参数 可订阅| 可订阅| PromiseLike | InteropObservable".
似乎我不能再使用defer来发送这样的动作,所以我不确定如何编写前进的初始化效果.
我只需要等待商店被初始化,所以在这个方法中我推迟执行,直到效果订阅了动作流.
有谁知道如何解决这个问题?
更新:
我还发现了一个利用Stackblitz的例子ROOT_EFFECTS_INIT,但是由于我在一个功能模块中,这不起作用(这里讨论)
import { ROOT_EFFECTS_INIT } from '@ngrx/effects';
@Effect()
init$ = this.actions$
.ofType(ROOT_EFFECTS_INIT)
.pipe(
map(() => {
const userData = localStorage.getItem('user');
return (userData)
? of(new Login(JSON.parse(userData)))
: of(new Logout())
})
);
Run Code Online (Sandbox Code Playgroud)
这是TypeScript限制.您可以通过在箭头函数中显式指定返回类型来解决此问题:
@Effect()
init$ = defer((): Observable<Action> => { // HERE
const userData = localStorage.getItem('user');
return (userData)
? of(new Login(JSON.parse(userData)))
: of(new Logout());
});
Run Code Online (Sandbox Code Playgroud)
或者,更具体地说:
@Effect()
init$ = defer((): Observable<Login | Logout> => { // HERE
const userData = localStorage.getItem('user');
return (userData)
? of(new Login(JSON.parse(userData)))
: of(new Logout());
});
Run Code Online (Sandbox Code Playgroud)
问题是没有显式返回类型,箭头函数的返回类型被推断为:
Observable<Login> | Observable<Logout>
Run Code Online (Sandbox Code Playgroud)
而不是:
Observable<Login | Logout>
Run Code Online (Sandbox Code Playgroud)
有趣的是,尽管它确实是TypeScript限制,但是这个RxJS PR将解决问题并且会看到推断的正确类型.
| 归档时间: |
|
| 查看次数: |
667 次 |
| 最近记录: |