具有Typescript Vuex对象的Vue Vuex对象未知类型

时间:2020-07-16 14:40:44

标签: typescript vue.js vuex

我在尝试使Typescript运行Vuex时遇到问题。我做了一个没有打字稿的例子,如下所示。我正在创建一个Vuex模块,然后如下所示添加它

src->存储-> index.js

import Vue from 'vue';
import Vuex from 'vuex';
import robotsModule from './modules/products';

Vue.use(Vuex);

export default new Vuex.Store({
  modules: {
    products: productsModule
  },
});

src->存储->模块-> products.js

import axios from 'axios';

export default {
  namespaced: true,
  state: {
    products: [],
  },
  mutations: {
    addProduct(state, product) {
      state.products.push(product);
    },
    updateProduct(state, products) {
      state.parts = products;
    },
  },
  actions: {
    getProducts({ commit }) {
      axios
        .get('/api/products')
        .then(result => commit('updateProduct', result.data))
        .catch(console.error);
    }
  },
};

现在,当我想使用打字稿时,它总是在抱怨

“绑定元素'commit'隐式地具有'any'类型。”

如您所见,我当前将状态指定为任何,这似乎也是错误的。 如何使用Typescript使其良好地工作?

src->存储->模块-> products.ts

import axios from 'axios';
import { Product } from '@/models/product';

export default {
  namespaced: true,
  state: {
    products: new Array<Product>(),
  },
  mutations: {
    updateProducts(state: any, products: Product[]) {
      state.products = products;
    },
    addProduct(state: any, product: Product) {
      state.products.push(product);
    },
  },
  actions: {
    getProducts({ commit }) {
      axios
        .get('/api/products')
        .then(result => commit('updateProducts', result.data))
        .catch(console.error);
    },
  },
};

2 个答案:

答案 0 :(得分:3)

我在网上找到了一个示例,表明我需要将提交作为函数

getProducts({ commit }: { commit: Function }) {

完整文件在这里

import axios from 'axios';

import { Product } from '@/models/product';
import State from '@/models/state';

export default {
  namespaced: true,
  state: {
    items: new Array<Product>(),
  } as State,
  mutations: {
    updateProducts(state: State, products: Product[]) {
      state.items = products;
    },
    addProduct(state: State, product: Product) {
      state.items.push(product);
    },
  },
  actions: {
    getProducts({ commit }: { commit: Function }) {
      axios
        .get('/api/products')
        .then(result => {
          commit('updateProducts', result.data);
        })
        .catch(console.error);
    },
  },
};

还要创建一个State类,然后我可以说这是我的状态对象

import Vue from 'vue';
import { Product } from '@/models/product';

export default class State extends Vue {
  items: Product[] = new Array<Product>();
}

答案 1 :(得分:1)

基于安德鲁的答案-您可以引入几个接口来整理一下代码:

export interface CommitFunction {
    commit: Commit;
}

export interface CommitStateFunction<T> extends CommitFunction {
    state: T;
}

所以您的操作将如下所示:

actions: {
    getProducts({ commit }: CommitFunction) { /* logic here */ },
    updateProducts({ commit, state }: CommitStateFunction<State>) { /* logic here */ }
}