From: Eduardo San Martin Morote Date: Wed, 28 Jul 2021 13:01:20 +0000 (+0200) Subject: feat(types): add StorState, StoreGetters, and StoreActions helpers X-Git-Tag: v2.0.0-rc.0~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=47c06101555328b6ca24e2f574f8f402b3bf1675;p=thirdparty%2Fvuejs%2Fpinia.git feat(types): add StorState, StoreGetters, and StoreActions helpers --- diff --git a/src/index.ts b/src/index.ts index b9c8c21e..99fba833 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ export { createPinia } from './createPinia' export type { Pinia, PiniaStorePlugin, PiniaPluginContext } from './rootStore' export { defineStore } from './store' +export type { StoreActions, StoreGetters, StoreState } from './store' export type { StateTree, diff --git a/src/store.ts b/src/store.ts index e69e779b..d64c10ec 100644 --- a/src/store.ts +++ b/src/store.ts @@ -36,6 +36,7 @@ import { DefineSetupStoreOptions, DefineStoreOptionsInPlugin, StoreGeneric, + StoreWithGetters, } from './types' import { getActivePinia, @@ -615,6 +616,45 @@ type _ExtractGettersFromSetupStore = _SpreadPropertiesFromObject< ComputedRef > +/** + * Extract the actions of a store type. Works with both a Setup Store or an + * Options Store. + */ +export type StoreActions = SS extends Store< + string, + StateTree, + GettersTree, + infer A +> + ? A + : _ExtractActionsFromSetupStore + +/** + * Extract the getters of a store type. Works with both a Setup Store or an + * Options Store. + */ +export type StoreGetters = SS extends Store< + string, + StateTree, + infer G, + ActionsTree +> + ? StoreWithGetters + : _ExtractGettersFromSetupStore + +/** + * Extract the state of a store type. Works with both a Setup Store or an + * Options Store. Note this unwraps refs. + */ +export type StoreState = SS extends Store< + string, + infer S, + GettersTree, + ActionsTree +> + ? UnwrapRef + : _ExtractStateFromSetupStore + // type a1 = _ExtractStateFromSetupStore<{ a: Ref; action: () => void }> // type a2 = _ExtractActionsFromSetupStore<{ a: Ref; action: () => void }> // type a3 = _ExtractGettersFromSetupStore<{ diff --git a/test-dts/tsconfig.json b/test-dts/tsconfig.json index 1a6da392..937f5669 100644 --- a/test-dts/tsconfig.json +++ b/test-dts/tsconfig.json @@ -3,9 +3,6 @@ "compilerOptions": { "noEmit": true, "declaration": true, - "paths": { - "vue-router": ["../dist"] - }, "noImplicitReturns": false }, "include": ["./"], diff --git a/test-dts/typeHelpers.test-d.ts b/test-dts/typeHelpers.test-d.ts new file mode 100644 index 00000000..383c5c41 --- /dev/null +++ b/test-dts/typeHelpers.test-d.ts @@ -0,0 +1,69 @@ +import { StoreDefinition } from 'dist/pinia' +import { computed, ref } from 'vue' +import { + StoreState, + StoreGetters, + StoreActions, + defineStore, + expectType, +} from './' + +const useSetupStore = defineStore('main', () => { + const n = ref(0) + + const double = computed(() => n.value * 2) + + function increment(amount = 1) { + n.value += amount + } + + return { n, increment, double } +}) + +const useOptionsStore = defineStore('main', { + state: () => ({ n: 0 }), + getters: { + double: (state) => state.n * 2, + }, + actions: { + increment(amount = 1) { + this.n += amount + }, + }, +}) + +declare function storeActions( + useStore: T +): StoreActions> + +declare function storeState( + useStore: T +): StoreState> + +declare function storeGetters( + useStore: T +): StoreGetters> + +expectType<{ + increment: (amount?: number) => void +}>(storeActions(useSetupStore)) + +expectType<{ n: number }>(storeState(useSetupStore)) + +expectType<{ double: number }>(storeGetters(useSetupStore)) + +expectType<{ + increment: (amount?: number) => void +}>(storeActions(useOptionsStore)) + +expectType<{ n: number }>(storeState(useOptionsStore)) + +expectType<{ double: number }>(storeGetters(useOptionsStore)) + +expectType<{ n: number }>( + storeState( + defineStore('', { + state: () => ({ n: ref(0) }), + }) + ) +)