Я новичок в Typescript и в процессе переноса моей базы исходного кода реагирования в Typescript. Есть странная ошибка, которую я не могу решить, как бы я ни пытался. вот редуктор:
const INITIAL_STATE: MessagingState = {
conversations: [],
send: [],
read: []
};
export default function (state: MessagingState = INITIAL_STATE, action:
UserMessagingActionTypes): MessagingState {
switch (action.type) {
case USER_CONVERSATIONS_RECEIVED:
return {...state, conversations: action.payload};
case USER_CONVERSATION_RECEIVED:
return {
...state,
conversations: [...state.conversations, action.payload]
};
default:
return state;
}
}
export interface MessagingState {
conversations: Conversation[]
send: StompMessage[]
read: ChatMessage[]
}
и типы действий:
export interface UserConversationsReceived {
type: typeof USER_CONVERSATIONS_RECEIVED,
payload: Conversation[]
}
export interface UserConversationReceived {
type: typeof USER_CONVERSATION_RECEIVED,
payload: Conversation
}
export interface UserStompUnseenMessageReceived {
type: typeof MESSAGING_ACTIONS.USER.UNSEEN_MESSAGE_RECEIVED,
payload: ChatMessage
}
export const MESSAGING_ACTIONS = {
USER:{UNSEEN_MESSAGE_RECEIVED: 'UNSEEN_MESSAGE_RECEIVED'}
}
export const USER_CONVERSATION_RECEIVED= 'USER_CONVERSATION_RECEIVED';
export const USER_CONVERSATIONS_RECEIVED = 'USER_CONVERSATIONS_RECEIVED';
export type UserMessagingActionTypes =
UserConversationsReceived
| UserConversationReceived
| UserStompUnseenMessageReceived;
Я ожидал, что сужение типа сработает на моем редукторе, но я получаю следующие две ошибки в ответеоператоры в редукторе:
Ошибка: (14, 31) TS2322: Тип 'Разговор |ChatMessage |Разговор [] 'нельзя назначить типу' Разговор [] '. Типу «Беседа» не хватает следующих свойств из типа «Беседа []»: длина, всплывающее, толчок, конкат и еще 26.
Ошибка: (18, 17) TS2322: Тип '(Conversation | ChatMessage | Conversation []) []' нельзя назначить типу 'Conversation []'. Тип 'Разговор |ChatMessage |Разговор [] 'не может быть назначен типу' Разговор '. В типе 'ChatMessage' отсутствуют следующие свойства из типа 'Диалог': title, unreadMessages, messages
Почему Conversaion [] нельзя назначить для Conversation []?
Редактировать 1: Этот кусок является виновником:
export const MESSAGING_ACTIONS = {
USER:
{UNSEEN_MESSAGE_RECEIVED: 'UNSEEN_MESSAGE_RECEIVED'}
}
Когда я изменяю это на строку const, как это:
export const UNSEEN_MESSAGE_RECEIVED: 'UNSEEN_MESSAGE_RECEIVED';
проблема решена. Я не знаю, как typeof отличается между ними двумя. Они оба строки. Но что происходит с компилятором, я не знаю.