关于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回答
-
同学你好 由于现在的设计理念 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
112020-10-27