如何在Vuex 4和TypeScript中使用其他存储模块getter/actions/mutations

如何在Vuex 4和TypeScript中使用其他存储模块getter/actions/mutations,typescript,vue.js,vuex,vuejs3,vuex4,Typescript,Vue.js,Vuex,Vuejs3,Vuex4,我正在使用TypeScript和Vuex4进行VUE3项目。 现在,我正在使用一个样板声明方法,用于vuex中带有TS的每个存储模块。 看起来是这样的: 或者,如果我的代码可读性不够,以下是我用来指导我的: /#地区商店 导出常量状态:状态={ stateVar:null, 伊瑟罗:错, }; 导出常量getters:GetterTree&getters={ getStateVar:state=>state.stateVar, getIsError:state=>state.isError,

我正在使用TypeScript和Vuex4进行VUE3项目。 现在,我正在使用一个样板声明方法,用于vuex中带有TS的每个存储模块。 看起来是这样的: 或者,如果我的代码可读性不够,以下是我用来指导我的:

/#地区商店
导出常量状态:状态={
stateVar:null,
伊瑟罗:错,
};
导出常量getters:GetterTree&getters={
getStateVar:state=>state.stateVar,
getIsError:state=>state.isError,
};
导出常量突变:突变树和突变={
[ModuleStationTypes.setStateVar](状态:状态,有效负载:StateVarType){
state.stateVar=有效载荷;
},
[ModuleStationTypes.SetiError](状态:状态,有效负载:布尔){
state.isError=有效载荷;
},
};
导出常量操作:操作树和操作={
异步[ModuleActionTypes.doRequest]({commit,getters}){
//做点什么并把它付诸实施
//例如,这里我想从另一个商店访问getter或action,这怎么可能呢
提交(ModuleStationTypes.setStateVar,someValue);
},
};
//#端域存储
//#区域存储类型
导出类型状态={
someStateVar:SomeStateVarType;
isError:布尔型;
};
导出类型getter={
getStateVar(state:state):someStateVarType;
getIsError(state:state):布尔值;
};
导出类型变异={
[ModuleStationTypes.setStateVar](状态:S,有效负载:SomeSTateVarType):void;
[ModuleStationTypes.SetiError](状态:S,有效负载:布尔):无效;
};
导出接口操作{
[ModuleActionTypes.doRequest](上下文:AugmentedActionContext):承诺;
}
类型AugmentedActionContext={
提交(key:K,payload:Parameters[1]):ReturnType;
吸气剂:{
[K in-keyof-Getters]:返回类型;
};
派遣(
关键:K,
有效载荷?:参数[1],
选项?:DispatchOptions
):返回类型;
}&省略;
//#端域存储类型
//#区域存储模块
导出类型ModuleStore=省略&{
承诺(
关键:K,
有效载荷:P,
选项?:承诺
):返回类型;
} & {
派遣(
关键:K,
有效载荷?:参数[1],
选项?:DispatchOptions
):返回类型;
} & {
吸气剂:{
[K in-keyof-Getters]:返回类型;
};
};
导出常量存储:模块={
国家,,
突变,
获得者,
行动,
//名称空间也会破坏一切
//但如果没有它,一家更大的商店可能会在namings发生冲突
//名称空间:对,
};

//#endregion存储类型和模块
要访问其他模块,您可以定义每个模块的动作/突变类型,并像这样导入所有这些类型

示例操作类型

//store/action-types.ts
从“/modules/root/action types”导入{ActionTypes as rootActionTypes};
从“/modules/authUser/action-types”导入{ActionTypes as authUserActionTypes}”;
从“/modules/counter/action-types”导入{ActionTypes as-antractiontypes}”;
导出常量AllActionTypes={
…AuthUserActionType,
…根操作类型,
…反作用类型,
};
在组件中,您可以这样使用

从“../../composables/useStore”导入{useStore}”;
从“../../store/action types”导入{AllActionTypes}”;
//设置()
const store=useStore();
onMounted(异步()=>{
等待store.dispatch(AllActionTypes.GET_USERS).catch((e)=>{
控制台日志(e);
});
等待存储。分派(AllActionTypes.GET_COUNT)。捕获((e)=>{
控制台日志(e);
});
});
关于你的第二个问题,这是我如何命名的

//store/index.ts
从“vuex”导入{createStore};
从“/interfaces”导入{IRootState};
从“/modules/authUser/types”导入{AuthUserStoreModuleTypes}”;
从“/modules/counter/types”导入{CounterStoreModuleTypes}”;
从“/modules/root/types”导入{RootStoreModuleTypes}”;
//所有模块都在根目录中注册
从“/modules/root”导入根目录;
导出常量存储=创建存储(根);
//名称空间
类型StoreModules={
计数器:计数器存储模块类型;
根:RootStoreModuleType;
authUser:AuthUserStoreModuleType;
};
导出类型存储=计数器存储模块类型&
RootStoreModuleType&
authUserStoreModuleType;

太棒了,这看起来很棒,我还有一个问题,因为你的回答没有涵盖,Getter如何在全球范围内访问?此外,您还向我展示了在组件中使用的allActionTypes示例,但这并不是一个非常简单的问题,但我如何在其他商店中使用它们。这也适用于getter?