Ошибка интерфейса действия «Свойство не существует для типа»

#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