Комментарии 20
Так самое-то важное, а как затипизированы commit
и dispatch
?
export type Category {
attributes: {
hasPrice: boolean;
icon: string;
lvl: number;
name: string;
slug: string;
};
id: number;
}
export interface IParams {
city_id: number
}
class AppState {
categories: Category[] = [];
}
/* ... */
class AppMutations extends Mutations<AppState> {
setCategories(categories: Category[]) {
this.state.categories = categories;
}
}
class AppActions extends Actions<
AppState,
AppGetters,
AppMutations,
AppActions
> {
async getCategories({params}: {params: IParams}): Promise<Category[]> {
return categoriesAPI.get({params}).then(
({ data: categories }: { data: Category[] }) => {
this.commit("setCategories", categories);
return categories;
}
);
}
}
Обновил статью. Спасибо, что указали на промах.
Главная проблема типизации в этой строчке:
this.commit("setCategories", categories)
Как вы обеспечиваете гарантию того, что такой mutation действительно существует и принимает именно такой набор аргументов?
Гарантия существования мутации и принимаемых аргументов:
class AppMutations extends Mutations<AppState> {
setCategories(categories: Category[]) {
this.state.categories = categories;
}
}
class AppActions extends Actions<
AppState,
AppGetters,
AppMutations,
AppActions
> { /* ... */ }
Вот пара файлов, в которых можно увидеть, как это реализовано: раз, два.
Мне кажется, что проблема вот тут
this.commit("setCategories12345", categories);
Если в названии мутации написать людей текст, то он будет комплимент, но не будет работать. Это — отсутствие типизация. Почему бы не указывать вместо строкового литерала именно член класса?
Если в названии мутации написать людей текст, то он будет комплимент, но не будет работать.
Это на Алиэкспресском написано?

ох, я бы сейчас не стал начинать проект на class components, сильно больно будет обновляться на vue 3
ну так я про синтаксис ничего не говорил, но вот в 3 версии искаропки не будет поддержки class api, рисковать ради непонятно чего? нафиг, лучше на объектном синтаксисе делать, что бы потом можно было легко обновится на 3 версию. или, даже лучше, быстро сконвертировать в новый функциональный синтаксис.
А мне было интересно и полезно, спасибо автору за статью (:
До этого работал с Vue только в связке с Flow, т.к. осознание преимущества типизации зашло не сразу (не у меня, у тиммейтов), а переделывать было уже некогда. Теперь вижу как можно подружить Vue с TS и первое впечатление крайне положительное (:
Мощный модуль для типизации Vuex