Skip to content

Commit fdae9b1

Browse files
committed
fix(hooks): improve vuex interface
1 parent e38cb26 commit fdae9b1

File tree

6 files changed

+56
-12
lines changed

6 files changed

+56
-12
lines changed

src/useActions.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { mapActions } from 'vuex';
12
import createVuexHelper, { Helper } from './util/helpers';
23

3-
export default createVuexHelper(Helper.Actions);
4+
export default createVuexHelper<typeof mapActions>(Helper.Actions);

src/useGetters.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useGetters } from 'vuex';
12
import createVuexHelper, { Helper } from './util/helpers';
23

3-
export default createVuexHelper(Helper.Getters);
4+
export default createVuexHelper<typeof useGetters>(Helper.Getters);

src/useMutations.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { mapMutations } from 'vuex';
12
import createVuexHelper, { Helper } from './util/helpers';
23

3-
export default createVuexHelper(Helper.Mutations);
4+
export default createVuexHelper<typeof mapMutations>(Helper.Mutations);

src/useState.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { useState } from 'vuex';
12
import createVuexHelper, { Helper } from './util/helpers';
23

3-
export default createVuexHelper(Helper.State);
4+
export default createVuexHelper<typeof useState>(Helper.State);

src/util/helpers.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
1-
import { computed } from 'vue-function-api';
2-
import { mapState, mapGetters, mapMutations, mapActions } from 'vuex';
1+
import { computed, Wrapper } from 'vue-function-api';
2+
import {
3+
useState,
4+
useGetters,
5+
mapState,
6+
mapGetters,
7+
mapMutations,
8+
mapActions,
9+
} from 'vuex';
310
import { getRuntimeVM } from './runtime';
411

512
export enum Helper {
@@ -9,13 +16,13 @@ export enum Helper {
916
Actions,
1017
}
1118

12-
function handleComputed(mappedFn: Function) {
19+
function handleComputed(mappedFn: Function): Wrapper<any> {
1320
// TypeError: Cannot read property '_modulesNamespaceMap' of undefined
1421
// You must get `runtimeVM` in real time in the calculation properties.
1522
return computed(() => mappedFn.call(getRuntimeVM()));
1623
}
1724

18-
function handleMethods(mappedFn: Function) {
25+
function handleMethods<T>(mappedFn: Function): T {
1926
return mappedFn.bind(getRuntimeVM());
2027
}
2128

@@ -26,17 +33,23 @@ const helpers = {
2633
[Helper.Actions]: { fn: mapActions, handler: handleMethods },
2734
};
2835

29-
export default function createVuexHelper(h: Helper) {
36+
export type Helpers =
37+
| typeof useState
38+
| typeof useGetters
39+
| typeof mapMutations
40+
| typeof mapActions;
41+
42+
export default function createVuexHelper<T extends Helpers>(h: Helper) {
3043
const helper = helpers[h];
3144

3245
return ((...args) => {
3346
// @ts-ignore
34-
const mapper = helper.fn(...args);
47+
const mapper = (helper.fn as T)(...args);
3548
const dictionary = {};
3649
Object.keys(mapper).forEach((key) => {
37-
dictionary[key] = helper.handler(mapper[key]);
50+
dictionary[key] = helper.handler<typeof mapper>(mapper[key]);
3851
});
3952

4053
return dictionary;
41-
}) as typeof helper.fn;
54+
}) as T;
4255
}

types/vuex/helpers.d.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import * as Vuex from 'vuex';
2+
import { Wrapper } from 'vue-function-api';
3+
4+
declare module 'vuex/types/helpers' {
5+
type ComputedWrapper = Wrapper<any>;
6+
7+
interface MapperForState {
8+
<S>(
9+
map: Dictionary<(this: CustomVue, state: S, getters: any) => any>,
10+
): Dictionary<ComputedWrapper>;
11+
}
12+
13+
interface MapperForStateWithNamespace {
14+
<S>(
15+
namespace: string,
16+
map: Dictionary<(this: CustomVue, state: S, getters: any) => any>,
17+
): Dictionary<ComputedWrapper>;
18+
}
19+
20+
export const useState: Mapper<ComputedWrapper> &
21+
MapperWithNamespace<ComputedWrapper> &
22+
MapperForState &
23+
MapperForStateWithNamespace;
24+
25+
export const useGetters: Mapper<ComputedWrapper> &
26+
MapperWithNamespace<ComputedWrapper>;
27+
}

0 commit comments

Comments
 (0)