typescript - 带有 Typescript Vuex 对象的 Vue Vuex 未知类型
问题描述
我在尝试让 Vuex 与 Typescript 一起工作时遇到问题。我做了一个没有打字稿的例子,它工作得很好,如下图所示。我正在创建一个 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' 类型。”
如您所见,我目前已将状态指定为任何似乎错误的状态。我如何使用打字稿很好地完成这项工作?
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);
},
},
};
解决方案
我在网上找到了一个示例,表明我需要将提交作为一个函数
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>();
}
2021 年 3 月 15 日更新 - 我的一位同事说他现在使用https://www.npmjs.com/package/direct-vuex,这更容易!
推荐阅读
- typescript - 使用 infer 和 typeof 在 Typescript 中创建工厂
- python - 如何修复我的 python kivy 文件夹监控应用程序崩溃
- python - 避免 x 既不增加也不减少:{}.".format(x) 计算 auc 分数时
- ios - Flutter,如何在添加到List之前确定适配器是否包含字符串
- c++ - 尝试调试时抛出 C++ 异常
- html - 在 div 中插入图标 --- 有没有聪明的方法?
- javascript - Firebase返回的值不在ejs中呈现
- node.js - 为什么我无法从 hasura 访问我机器的端口?
- cordova - 使用 cordova-plugin-ble-central 连接 BLE 而无需扫描
- mongoose - 尚未为模型“ModuleSchema”注册架构