Convert Observable from createSelector using ngrx and rxjs (TS2740: Type 'MemoizedSelector error)

问题描述 投票:0回答:2

所以我从 ngrx 商店检索数据的传统方法是:

public getUser(): Observable<IUser> {
  return this.store.select(store => store.users.selectedUser);
}

但我正在尝试转换为使用 createSelecor (ngrx 15) 因此尝试:

 public getUser(): Observable<IUser> {
        const user = createSelector((state: IAppState) => state.users,
            (userState) => {
                return userState;
            }
        );
        return user;
    }

但出现以下错误:

TS2740: Type 'MemoizedSelector<IAppState, IUserState, (s1: IUserState) => IUserState>' is missing the following properties from type 'Observable<IUser>': source, operator, lift, subscribe, and 3 more.

所以我的问题是如何从

createSelecor 
得到一个 Observable,这样我以后可以做:

        this.storeSelector.getUser().subscribe((a) => {
            console.log(a);
        });

TypeScript 不满意:

Observable<IUser>
返回类型。

谢谢。

typescript rxjs ngrx
2个回答
1
投票

你的答案中的例子可能不会记忆,因为你每次都声明一个新的选择器。

你真的不需要

getUserMemoize
功能,因为它的主体很简单,你可以直接使用。

export const getUser = createSelector((state: IAppState) => state.users,
  (userState) => userState.selectedUser
 ));

...
public getUserMemoize(){
  return this.store.select(getUsers);
}

// Or use directly
const users$ = this.store.select(getUsers);


0
投票

认为这是方式:

    ...
    private selectorGetUsers$ = null;
    ...

/**  Example3: createSelector avoid creating createSelector everytime for best memoization combines slices **/
    getUserCombinesExample3(): Observable<IUser> {
        if (!this.selectorGetUsers$) {
            this.selectorGetUsers$ = createSelector((state: IAppState) => state.users,
                (userState) => userState.selectedUser
            );
        }
        return this.store.select(this.selectorGetUsers$);
    }

评论?

© www.soinside.com 2019 - 2024. All rights reserved.