关于Vuex的createStore和useStore泛型参数传递问题.

来源:6-11 Vuex 整合当前应用

慕莱坞0998854

2020-10-26

老师在刚介绍createStore的时候,说为了更好的类型推断,这个函数接受一个泛型参数,然后返回的结果的state就是这个类型

可是我发现没有像视频中那样传入类型参数,也可以获取到类型推断。

 // 如下,并未给createStore提供类型参数
 // 在使用store.state的时候,依然有代码提示 
 const store = createStore({
   state: {
     columns: testData,
    posts: testPosts,
     user: {
       isLogin: false
     }
   },
   mutations: {}
 });

与上述情况相反的是,在组件里面想要获取到store实例,需要使用useStore这个函数,但是此时需要传入类型参数T,才能获取正确的代码提示,

	// App.vue 和 Home.vue
	import { GlobalDataProps } from "./store";
	const store = useStore<GlobalDataProps>();
	// Login.vue
	store.commit("login");

这里的问题有两个
1> 每次想使用store里面的数据,我们都必须引入GlobalDataProps这个类型,才能获取正确的代码提示,可是store的state的类型在它创建的时候就已经由createStore写好了啊,为啥每个组件使用的时候还要重新再写一次类型呢?
2> 在Login.vue中,调用store.commit()的时候,并没有提示我们可以commit哪些方法,我认为它应该提示我们有login这个方法,可是TS并没有提示,感觉不正常。

写回答

1回答

张轩

2020-10-27

同学你好 由于现在的设计理念 useStore 作为一个函数是没法推论在 createStore 中返回的具体类型的,我们需要手动的传入 state 的类型,同学可以去看一下它的定义文件,这个定义文件很简单,同学如果想学好 ts 可以看看。

export function useStore<S = any>(): Store<S>;

如果觉得每次都引入麻烦,可以在helper中创建一个帮助函数,指定返回的是 Store<GlobalDataProps> 即可,就不用每次都引入啦。

第二个问题:和第一个问题一样的,现在类型只传入了 Store,没有其他对应的类型,所以 getters,commit,dispatch 等都没法有对应的类型,这个问题有可能在以后的 vuex 中会被添加进去,当然也有很多人和你一样希望有这个功能,提了一些 issue 

https://github.com/vuejs/vuex/issues/1843

https://github.com/vuejs/vuex/issues/1831

1
1
慕莱坞0998854
非常感谢!
2020-10-27
共1条回复

Vue3 + TS 仿知乎专栏企业级项目

带你完成前后端分离复杂项目,率先掌握 vue3 造轮子技能

3142 学习 · 2313 问题

查看课程