From: Tycho Date: Thu, 28 Nov 2024 11:41:15 +0000 (+0800) Subject: fix(types): unwrap refs in `mapWritableState` for setup stores (#2805) X-Git-Tag: v2.2.8~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ea14e53fdfc0d0f4cd80d5242572f87714a77e3b;p=thirdparty%2Fvuejs%2Fpinia.git fix(types): unwrap refs in `mapWritableState` for setup stores (#2805) Co-authored-by: Eduardo San Martin Morote Co-authored-by: Eduardo San Martin Morote fix #2804 --- diff --git a/packages/pinia/src/mapHelpers.ts b/packages/pinia/src/mapHelpers.ts index 8fb656aa..4cb21900 100644 --- a/packages/pinia/src/mapHelpers.ts +++ b/packages/pinia/src/mapHelpers.ts @@ -1,4 +1,4 @@ -import type { ComponentPublicInstance, ComputedRef } from 'vue-demi' +import type { ComponentPublicInstance, ComputedRef, UnwrapRef } from 'vue-demi' import type { _GettersTree, _Method, @@ -431,7 +431,7 @@ export function mapActions< /** * For internal use **only** */ -export type _MapWritableStateReturn = { +export type _MapWritableStateReturn = { [key in keyof S]: { get: () => S[key] set: (value: S[key]) => any @@ -442,7 +442,7 @@ export type _MapWritableStateReturn = { * For internal use **only** */ export type _MapWritableStateObjectReturn< - S extends StateTree, + S, T extends Record, > = { [key in keyof T]: { @@ -464,11 +464,11 @@ export function mapWritableState< S extends StateTree, G extends _GettersTree, A, - KeyMapper extends Record, + KeyMapper extends Record>, >( useStore: StoreDefinition, keyMapper: KeyMapper -): _MapWritableStateObjectReturn +): _MapWritableStateObjectReturn, KeyMapper> /** * Allows using state and getters from one store without using the composition * API (`setup()`) by generating an object to be spread in the `computed` field @@ -482,16 +482,11 @@ export function mapWritableState< S extends StateTree, G extends _GettersTree, A, - Keys extends keyof S, + Keys extends keyof UnwrapRef, >( useStore: StoreDefinition, keys: readonly Keys[] -): { - [K in Keys]: { - get: () => S[K] - set: (value: S[K]) => any - } -} +): Pick<_MapWritableStateReturn>, Keys> /** * Allows using state and getters from one store without using the composition * API (`setup()`) by generating an object to be spread in the `computed` field diff --git a/packages/pinia/src/types.ts b/packages/pinia/src/types.ts index e726415c..4ca20da9 100644 --- a/packages/pinia/src/types.ts +++ b/packages/pinia/src/types.ts @@ -11,7 +11,7 @@ import { Pinia } from './rootStore' /** * Generic state of a Store */ -export type StateTree = Record +export type StateTree = Record export function isPlainObject( value: S | unknown diff --git a/packages/pinia/test-dts/mapHelpers.test-d.ts b/packages/pinia/test-dts/mapHelpers.test-d.ts index fbb51641..3d2770a0 100644 --- a/packages/pinia/test-dts/mapHelpers.test-d.ts +++ b/packages/pinia/test-dts/mapHelpers.test-d.ts @@ -130,6 +130,20 @@ mapWritableState(useOptionsStore, ['upper']) // @ts-expect-error: cannot use a getter mapWritableState(useOptionsStore, { up: 'upper' }) +expectType<{ + foo: { + get: () => 'on' | 'off' + set: (v: 'on' | 'off') => any + } +}>(mapWritableState(useSetupStore, { foo: 'a' })) + +expectType<{ + a: { + get: () => 'on' | 'off' + set: (v: 'on' | 'off') => any + } +}>(mapWritableState(useSetupStore, ['a'])) + const setupStoreWithState = mapState(useSetupStore, ['a']) // store with no getters