#reactjs #typescript #redux #react-redux
Вопрос:
У меня есть type
, который может принимать структуру из 3 интерфейсов, но при использовании свойства 2 из этих 3 интерфейсов я получаю сообщение об ошибке.
Действие должно иметь token
свойство, когда оно принимает структуру IAuthSuccessAction
интерфейса, и error
свойство, когда оно принимает структуру IAuthFailAction
интерфейса.
Что я пропустил?
После того, как я попытаюсь применить данное предложение от @Baka:
Комментарии:
1. почему вы объединяете тип с интерфейсом?
2. @programoholic поэтому я могу установить
action
внутри редуктора как AuthAction, который будет уважать один из этих 3 интерфейсов
Ответ №1:
Удалите IBasicAction
из AuthAction
объединения и добавьте уникальные type
поля в IAuthFailAction
и IAuthSuccessAction
(повторно используйте значения из actionTypes
) следующим образом:
interface IAuthFailAction extends IBasicAction {
type: 'fail';
error: object;
}
interface IAuthSuccessAction extends IBasicAction {
type: 'success';
token: string;
}
type AuthAction = IAuthFailAction | IAuthSuccessAction;
Таким образом, вы получите различаемое объединение, и TS сможет определить, какое свойство доступно на основе type
поля
Если actionTypes
определено как буквальный объект, рассмотрите возможность использования const
утверждения или переключитесь на enum
. Также вам необходимо использовать typeof
operator при ссылке на тип свойства вашего литерального объекта, например
const actionTypes = {
ACTION: 'ACTION',
} as const
interface ISomeAction {
type: typeof actionTypes.ACTION
}
const action: ISomeAction = {
type: 'ACTION'
}
Пример с enum
:
enum actionTypes {
ACTION = 'ACTION'
}
interface ISomeAction {
type: actionTypes.ACTION
}
const action: ISomeAction = {
type: actionTypes.ACTION
}
Комментарии:
1. К сожалению, по какой-то причине я не могу использовать строку, хранящуюся внутри
actionTypes.AUTH_FAIL
. Более подробная информация на последних 2 фотографиях поста2. @gusti отредактировал мой ответ с примерами о том, как вы можете повторно использовать свойства
actionTypes