【发布时间】:2019-05-17 08:26:47
【问题描述】:
到目前为止,我找到的有关该主题的唯一信息是article。
我正在尝试使用 2 个模块来实现商店。
export interface RootState {
/** root state props **/
}
const store: StoreOptions<RootState> = {
modules: {
foo,
bar,
},
};
export default new Vuex.Store<RootState>(store);
然后我有两个模块:
export interface FooState {
//(...)
}
export const foo: Module<FooState, RootState> = {
//(...)
};
export interface BarState {
//(...)
}
export const bar: Module<BarState, RootState> = {
//(...)
};
一切都还好,直到我遇到需要从 foo 模块获取 getter 来访问 bar 状态的情况:
export const getters: GetterTree<FooState, RootState> = {
getInfo: (state, {}, rootState) => number {
const value = rootState.bar.somevalue;
//(...)
},
};
我有一个 linting 错误,解释 rootState 没有 bar 属性。经过一段时间的思考,我设法解决了更改原始 RootState 接口的错误:
export interface RootState {
/** root state props **/
foo: FooState;
bar: BarState;
}
它解决了问题,非常适合 IDE 智能感知。
这种方法正确吗?要将所有模块添加到 StoreOptions 使用的 RootState 接口中?
此外,似乎缺乏关于这些类型化接口(StoreOptions、Module、GetterTree 等)的文档:Vuex 是否成熟到可以与 typescript 一起使用?
编辑:我忘了提:当从组件访问存储时,我仍然需要强制转换 this.$store(但可以使用vuex-class 将其最小化)。似乎有一个question 打开了它而没有答案。我想到目前为止还没有其他解决方案,对吗?
【问题讨论】:
-
在您的编辑中,在
vue-shim.d.ts文件中(假设您有一个)只需将 $store 声明为Store<RootState>。 -
@Ohgodwhy 我有一个 shims-vue.d.ts 但我认为它是一样的。我不知道如何在那里更改商店类型。你能给我举个例子吗?到目前为止,我发现的最好的解决方法是:forum.vuejs.org/t/…
-
@Ohgodwhy 这个文件是干什么用的?如何设置店铺类型?
-
使用 vuex4,你可以像这样访问 getter:
this.$store.getters['YourSubModule/yourGetterName']stackoverflow.com/questions/41833424/…
标签: typescript vue.js vuex