在使用了TypeScript后,如果项目中用到了vuex,那么可以使用vuex-module-decorators这个第三方库,引入装饰器。

在使用装饰器之前,还是首先来看看TypeScript中,是怎样使用vuex的。

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

export default new Vuex.Store({
  state: {
    posts: "这是post"
  },
  mutations: {
    /** 给post赋值 */
    SET_POSTS(state, data) {
      state.posts = data;
    }
  },
  actions: {
    /** 模拟异步获取post的值 */
    getPostsData({ commit }) {
      setTimeout(() => {
        commit("SET_POSTS", "修改post");
      }, 3000);
    }
  },
  modules: {}
});

上面的vuex是生成项目时,官方给出的模板。

但是一般来讲,更推荐下面的这种方式,声明一个接口规范state里面的状态类型:

import Vue from "vue";
import Vuex from "vuex";

Vue.use(Vuex);

/** 规范state里面状态的类型 */
export interface MainState {
  /** 测试用的状态 */
  posts: string;
}

export default new Vuex.Store<MainState>({
  state: {
    posts: "这是post"
  },
  mutations: {
    /** 给post赋值 */
    SET_POSTS(state, data) {
      state.posts = data;
    }
  },
  actions: {
    /** 模拟异步获取post的值 */
    getPostsData({ commit }) {
      setTimeout(() => {
        commit("SET_POSTS", "修改post");
      }, 3000);
    }
  },
  modules: {}
});

vuex-module-decorators

首先引入这个库:

npm install vuex-module-decorators

vue3

这个库还是有点厉害的,最近在Vue3中尝试引入这个库。

发现在Vue3中也是可以正常使用。并且表现比在Vue2中更为强大,可以直接在ts文件调用同步异步方法。

最后

至于使用vuex-module-decorators的好处嘛,就是拥有更好的类型推断,因为在往常的vuex写法在.vue文件中通过this.$store.dispatch("方法名")进行调用时,是没有代码提示的,所以有些人也会使用声明常量的方式来获取代码提示。

但是!在WebStorm中,这种调用方法已经拥有代码提示,所以声明常量的方式也就不必要了。

vuexdispatch

this.$store.commit("方法名")也是同样的~

所以如果你用的是WebStorm,其实用不用vuex-module-decorators都能够获得代码提示。