Как передать селектору два разных свойства? - PullRequest
0 голосов
/ 29 мая 2020

У меня есть selector, который зависит от другого, ему нужен userId, чтобы иметь возможность «работать».

Но теперь я хотел бы создать селектор, который получает «userId ", а также получает другое свойство, называемое" userFriend ".

Что происходит, так это то, что он жалуется на передачу этого параметра, поскольку он находит только одно свойство, а именно" userId ".

ОШИБКА 1:

Property 'userFriend' does not exist on type '{ userId: any; }'

ОШИБКА 2:

TS2339: Property 'userFriend' does not exist on type '{userId: any; } '.

34 (latestReadMessages, totalUnreadMessages, {userId, userFriend}) => {
                                                        ~~~~~~~~~~
src / app / services / store / chat / chat-selectors.service.ts: 34: 26 - error TS2769: No overload matches this call.
  Overload 1 of 8, '(mapFn: (state: object, props: {userId: any;}) => IChatFriendLatestMessageList, props ?: {userId: any;}): (source $: Observable <object>) => Observable <...> ', gave the following error.
    Argument of type '{userId: string; userFriend: IUser; } 'is not assignable to parameter of type' {userId: any; } '.
      Object literal may only specify known properties, and 'userFriend' does not exist in type '{userId: any; } '.
  Overload 2 of 8, '(key1: "user" | "chat", key2: "loading" | "data" | "dataError" | "ids" | "entities"): (source $: Observable <IStoreState>) = > Observable <any> ', gave the following error.
    Argument of type 'MemoizedSelectorWithProps <object, {userId: any; }, IChatFriendLatestMessageList, DefaultProjectorFn <IChatFriendLatestMessageList>> 'is not assignable to parameter of type' "user" | "chat" '.
      Type 'MemoizedSelectorWithProps <object, {userId: any; }, IChatFriendLatestMessageList, DefaultProjectorFn <IChatFriendLatestMessageList>> 'is not assignable to type' "chat" '.

34 return this.store.pipe (select (selector.getFriendLatestMessageList, {userId, userFriend}));
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~

СЕЛЕКТОРЫ:

export const messagesById = createSelector(selectAll, (chat: IChat[], { userId }) => {
  let messageIndex = 0;
  return chat.map((props, index) => {
    if (props.id === userId) {
      messageIndex = index;
      return props.messages;
    } else {
      return [];
    }
  })[messageIndex];
});

export const isLoading = createSelector(FEATURE_SELECTOR, ({ loading }) => loading);
export const error = createSelector(FEATURE_SELECTOR, ({ dataError }) => dataError);
export const friendMessages = createSelector(messagesById, messages => messages.filter(msg => !msg.isMain));
export const friendLatestMessage = createSelector(friendMessages, messages => messages[messages.length - 1]);
export const friendLatestReadMessages = createSelector(friendMessages, messages => messages.filter(msg => msg.isRead));
export const friendLatestUnreadMessages = createSelector(friendMessages, messages =>
  messages.filter(msg => !msg.isRead)
);
export const totalUnreadMessagesFriend = createSelector(friendLatestUnreadMessages, messages => messages.length);

export const getFriendLatestMessageList = createSelector(
  friendLatestMessage,
  totalUnreadMessagesFriend,

  (latestReadMessages, totalUnreadMessages, { userId, userFriend }) => {
    const latestMessageList: IChatFriendLatestMessageList = {
      user: userFriend.id,
      informations: {
        chatMessage: [latestReadMessages],
        isNewLastMessage: !userFriend.isClicked && totalUnreadMessages > 0,
        total: totalUnreadMessages,
      },
    };

    return latestMessageList;
  }
);

СЕРВИС ДЛЯ ВЫБОРКИ ОТПРАВКИ:

getFriendLatestMessageListById(userId: string, user: IUser): Observable<IChatFriendLatestMessageList> {
    return this.store.pipe(select(selector.getFriendLatestMessageList, { userId, user }));
}

ИНТЕРФЕЙС:

export interface IChatFriendLatestMessageList {
    userFriend: IUser;
    informations: {
        chatMessage: IChatMessage[];
        isNewLastMessage: boolean;
        total: number;
    };
}

СКРИНШОТ ОШИБКИ enter image description here

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Проблема вызвана тем, что этот селектор имеет собственные свойства, и в то же время он использует родительские селекторы, которые также имеют собственные свойства.

NGRX не поддерживает его, и чтобы он работал, нам нужно инкапсулировать родительские селекторы.

export const getFriendLatestMessageList = createSelector(
    s => s, // selecting the whole store.
    (store, { userId, userFriend }) => {
        // selecting our state.
        const latestReadMessages = friendLatestMessage(store, { userId });
        const totalUnreadMessages = totalUnreadMessagesFriend(store, { userId });
        // using them.
        const latestMessageList: IChatFriendLatestMessageList = {
            user: userFriend,
            informations: {
                chatMessage: [latestReadMessages],
                isNewLastMessage: !userFriend.isClicked && totalUnreadMessages > 0,
                total: totalUnreadMessages,
            },
        };

        return latestMessageList;
    }
);
0 голосов
/ 29 мая 2020

Попробуйте изменить имя параметра функции

getFriendLatestMessageListById(userId: string, userFriend: IUser): Observable<IChatFriendLatestMessageList> {
  return this.store.pipe(select(selector.getFriendLatestMessageList, { userId, userFriend}));
}
...