Я переписываю проект Ionic для работы с ngrx, потому что он сильно растет, и мне нужно поддерживать централизованное состояние.
Я реализовал его с помощью ngrx и использую нормализованные состояния с помощью Normalizr.
Теперь у меня есть сомнения относительно того, как передать немому компоненту заполненный объект:
Предположим, у меня есть два интерфейса:
interface Conversation {
date: Date,
lastMessage: string //this is the id of a message entity coming from normalizr
}
и
interface Message {
content: string
}
Теперь, когда я пытаюсь передать все разговоры немому компоненту, я использую селектор, подобный следующему:
getConversations() {
//select all the conversations to have a shape of Conversation[]
let conversations$ = this.store.select(state => Object.keys(state.entities.conversations).map( (id:string) => state.entities.conversations[id] ));
//select all the messages in a shape { [id:string] : Message }
let messages$ = this.store.select(state => state.entities.messages);
return Observable.combineLatest(
conversations$,
messages$,
(conversations, messages) => {
return conversations.map(conversation => {
return { ...conversation, lastMessage: messages[conversation.lastMessage] }
});
}
)
}
Но наблюдаемое, которое я возвращаю, не является массивомРазговор [], потому что
return { ...conversation, lastMessage: messages[conversation.lastMessage] }
помещает в lastMessage объект типа Message вместо String.
Я пытался использовать интерфейсы с типом объекта вместо строк
interface Conversation {
date: Date,
lastMessage: Message
}
Но тогда я не могу использовать селектор, как
this.store.select(state => state.entities.messages[conversation.lastMessage]
, потому что он больше не является строкой.
Как мне этого добиться?
Спасибо