mutationやactionは「お店の注文受付」。
でも「何を注文できるのか?」が書いてないと、勝手に「チョコレート」とか注文されて困る。
だから「注文票(型)」を書くことで、間違った注文を防ぐ。
store/types.ts
// RootState: stateの型
export interface RootState {
count: number;
userName: string;
}
// MutationTypes: mutationの名前を文字列リテラル型で定義
export const MutationTypes = {
Increment: 'increment',
SetUserName: 'setUserName'
} as const;
// MutationPayloads: mutationごとの引数の型
export interface MutationPayloads {
[MutationTypes.Increment]: undefined; // incrementは引数なし
[MutationTypes.SetUserName]: string; // setUserNameは文字列(ユーザー名)
}
MutationPayloads
を使う)// store/index.ts
import Vue from 'vue';
import Vuex, { StoreOptions, MutationTree, ActionTree } from 'vuex';
import { RootState, MutationTypes, MutationPayloads } from './types';
Vue.use(Vuex);
// Mutationの型付き実装
const mutations: MutationTree<RootState> = {
// countを1増やす(引数なし)
[MutationTypes.Increment](state) {
state.count++;
},
// ユーザー名をセットする(引数: string)
[MutationTypes.SetUserName](state, payload: MutationPayloads['setUserName']) {
state.userName = payload;
}
};
const actions: ActionTree<RootState, RootState> = {
async updateUserName({ commit }, name: string) {
// commit時に型が効く! → nameはstring型じゃないとエラー
commit(MutationTypes.SetUserName, name);
}
};