function* changeTodo(action: TT) {
try {
if (action.type === TodosActionsTypes.CHANGE_TODO) {
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) {
console.error(e);
}
}
string
и { checked: boolean; id: number; }
? Это два совершенно разных типа. Что-то не может быть одновременно и тем и тем.any
, специальный уникальный тип для затыкания дыр, который в обычном коде использовать нельзя. Другие же типы могут быть только более-менее конкретны. router.beforeEach(async (to, from, next) => {
if(!to.meta.requireAuth) {
return next();
}
if(store.getters['auth/isAuthorized']) {
// тут может быть проверка не устаревает ли токен по времени
// и запрос нового, но лучше если этим автоматически
// в фоновом режиме будет заниматься либа\самописный сервис
// if (await store.dispatch('auth/updateTokenIfNearExpired'))
return next();
}
return next('/login');
})
export default { ... }
ты экспортируешь простой объект без типа. Это не объект Vue это просто какой-то объект. В нём нет никаких стандартных методов и вообще ничего, кроме того что ты явно в нём написал.defineComponent
принимает на вход объект конкретного типа, а потому к нему применяются все прописанные для нужных типов условия.
if
иswitch
? Ну напиши так, если тебе это понятнее:Если ты работаешь с двумя типами на вход, ты должен отделить обработку одного от обработки другого. А через
switch
ты это сделаешь, черезif
, или через танец живота - значения не имеет.Просто ответ да: "либо условие в функции, либо отдельный интерфейс".
Но я всё ещё хочу понять, а как ты себе представляешь что-то иное.
Вот прилетел тебе в
payload
string
, что дальше?Допустим typescript бы это пропустил в таком виде как есть. Тогда у нас
payload.checked
иpayload.id
-undefined
. Иcall
иaxios
иput
при этом выполнятся без ошибок, но с неверными значениями. Именно для защиты от такого как раз и придуман typescript.