Vuex.Store<RootState>
)Vuex.Store<RootState>
と書くことで、「このstoreのstateはRootState型だ」と教えるstate
, getters
, mutations
, actions
すべてに型チェックが入るもし冷蔵庫に「牛乳と卵がある」と書いたら、
他のもの(たとえばチョコレート)を入れようとすると怒られる。
これが 型をつける ということ。
store/index.ts
// VueとVuexをインポート
import Vue from 'vue';
import Vuex, { StoreOptions } from 'vuex';
// RootStateの型を定義(ここでは簡単なカウンター)
export interface RootState {
count: number; // カウント用の数字
userName: string; // ユーザー名
}
// VueにVuexをセット
Vue.use(Vuex);
// StoreオプションにRootStateを使う
const storeOptions: StoreOptions<RootState> = {
// 1. state: データ本体(型はRootState)
state: {
count: 0, // 初期値 0
userName: 'Taro' // 初期ユーザー名
},
// 2. mutations: stateを変える(同期)
mutations: {
// countを1増やす
increment(state) {
state.count++;
},
// ユーザー名を変更する
setUserName(state, name: string) {
state.userName = name;
}
},
// 3. getters: 計算した結果を返す
getters: {
// ユーザー情報を文字列で返す
userInfo(state): string {
return `${state.userName} (${state.count})`;
}
},
// 4. actions: 非同期処理、mutationを呼ぶ
actions: {
// 1秒後にユーザー名をセットする
async updateUserName({ commit }, name: string) {
await new Promise(resolve => setTimeout(resolve, 1000)); // 1秒待つ
commit('setUserName', name); // mutationを呼ぶ
}
}
};
// 型付きでStoreを作成
export const store = new Vuex.Store<RootState>(storeOptions);
this.$store.state.count
と書いた時点で補完が効くthis.$store.state.counter
と書くと エラーになる(counterなんてないよ!)