]> git.ipfire.org Git - thirdparty/vuejs/pinia.git/commitdiff
feat(types): add StorState, StoreGetters, and StoreActions helpers
authorEduardo San Martin Morote <posva13@gmail.com>
Wed, 28 Jul 2021 13:01:20 +0000 (15:01 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Wed, 28 Jul 2021 13:01:20 +0000 (15:01 +0200)
src/index.ts
src/store.ts
test-dts/tsconfig.json
test-dts/typeHelpers.test-d.ts [new file with mode: 0644]

index b9c8c21ef58f80c014e79d67eb88a36a11a880a0..99fba833912fc4b2a552b71eadb0429c9943140c 100644 (file)
@@ -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,
index e69e779bed58fc78f0c7860c23b7e03672b2bf39..d64c10ec17cb62fa0f5b1cfd89bff5b8830a941a 100644 (file)
@@ -36,6 +36,7 @@ import {
   DefineSetupStoreOptions,
   DefineStoreOptionsInPlugin,
   StoreGeneric,
+  StoreWithGetters,
 } from './types'
 import {
   getActivePinia,
@@ -615,6 +616,45 @@ type _ExtractGettersFromSetupStore<SS> = _SpreadPropertiesFromObject<
   ComputedRef<any>
 >
 
+/**
+ * Extract the actions of a store type. Works with both a Setup Store or an
+ * Options Store.
+ */
+export type StoreActions<SS> = SS extends Store<
+  string,
+  StateTree,
+  GettersTree<StateTree>,
+  infer A
+>
+  ? A
+  : _ExtractActionsFromSetupStore<SS>
+
+/**
+ * Extract the getters of a store type. Works with both a Setup Store or an
+ * Options Store.
+ */
+export type StoreGetters<SS> = SS extends Store<
+  string,
+  StateTree,
+  infer G,
+  ActionsTree
+>
+  ? StoreWithGetters<G>
+  : _ExtractGettersFromSetupStore<SS>
+
+/**
+ * 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> = SS extends Store<
+  string,
+  infer S,
+  GettersTree<StateTree>,
+  ActionsTree
+>
+  ? UnwrapRef<S>
+  : _ExtractStateFromSetupStore<SS>
+
 // type a1 = _ExtractStateFromSetupStore<{ a: Ref<number>; action: () => void }>
 // type a2 = _ExtractActionsFromSetupStore<{ a: Ref<number>; action: () => void }>
 // type a3 = _ExtractGettersFromSetupStore<{
index 1a6da3927969644b3fbdda297f9e6a277ffd8a1b..937f56697b104f7a8e3a984a9457434cf9d126f0 100644 (file)
@@ -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 (file)
index 0000000..383c5c4
--- /dev/null
@@ -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<T extends StoreDefinition>(
+  useStore: T
+): StoreActions<ReturnType<T>>
+
+declare function storeState<T extends StoreDefinition>(
+  useStore: T
+): StoreState<ReturnType<T>>
+
+declare function storeGetters<T extends StoreDefinition>(
+  useStore: T
+): StoreGetters<ReturnType<T>>
+
+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) }),
+    })
+  )
+)