@iordania

Как реализовать union типы для action?

Учу typescript и пытаюсь сделать union тип для многих экшенов, но почему-то не подхватывается если у payload есть вложенность, как можно исправить ? в каком направлении документации к ts копать ?
export type TodoCH = {
  type: TodosActionsTypes.CHANGE_TODO;
  payload: {
    checked: boolean;
    id: number;
  };
};

export type TodoAD = {
  type: TodosActionsTypes.ADD_TODO;
  payload: string;
};

type TT = TodoCH | TodoAD

function* changeTodo(action: TT) {
  try {
    yield call(() =>
      axios.patch(`http://localhost:3100/todos/${action.payload.id}`, {
        checked: !action.payload.checked,
      })
    );
    yield put({
      type: TodosActionsTypes.CHANGE_TODO_SUCCESS,
      payload: action.payload.id,
    });
  } catch (e) {}
}


в данном случае выпадает 2 ошибки на id и checked:
// Property 'checked' does not exist on type 'string | { checked: boolean; id: number; }'.
// Property 'checked' does not exist on type 'string'.

// Property 'id' does not exist on type 'string | { checked: boolean; id: number; }'.
// Property 'id' does not exist on type 'string'.
  • Вопрос задан
  • 77 просмотров
Решения вопроса 1
Aetae
@Aetae Куратор тега TypeScript
Тлен
Также как и всегда, в этом суть типов.
Переданное значение может быть или одного типа или другого. И пока ты явно не проверишь через if какого же именно типа прилетело значение - использовать его нельзя.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы