From fe6f21b01862d18045eec996f03ef4023c04f902 Mon Sep 17 00:00:00 2001 From: tycho Date: Fri, 25 Oct 2024 16:32:29 +0800 Subject: [PATCH 1/2] fix(types): unwrap refs in `mapWritableState` for setup stores --- packages/pinia/src/mapHelpers.ts | 11 ++++------- packages/pinia/src/types.ts | 2 +- packages/pinia/test-dts/mapHelpers.test-d.ts | 20 +++++++++++++++++--- 3 files changed, 22 insertions(+), 11 deletions(-) diff --git a/packages/pinia/src/mapHelpers.ts b/packages/pinia/src/mapHelpers.ts index 8fb656aa0d..c2c2483886 100644 --- a/packages/pinia/src/mapHelpers.ts +++ b/packages/pinia/src/mapHelpers.ts @@ -465,10 +465,11 @@ export function mapWritableState< G extends _GettersTree, A, KeyMapper extends Record, + SS extends StateTree = Store, >( useStore: StoreDefinition, keyMapper: KeyMapper -): _MapWritableStateObjectReturn +): Pick<_MapWritableStateObjectReturn, keyof 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 @@ -483,15 +484,11 @@ export function mapWritableState< G extends _GettersTree, A, Keys extends keyof S, + SS extends StateTree = Store, >( 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 e726415c4f..4ca20da9e3 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 c6cdd7a84c..3d2770a05e 100644 --- a/packages/pinia/test-dts/mapHelpers.test-d.ts +++ b/packages/pinia/test-dts/mapHelpers.test-d.ts @@ -116,7 +116,7 @@ expectType<{ } }>(mapWritableState(useOptionsStore, ['a'])) // @ts-expect-error: only defined in array -mapWritableState(useStore, ['a']).b +mapWritableState(useOptionsStore, ['a']).b expectType<{ newA: { @@ -126,9 +126,23 @@ expectType<{ }>(mapWritableState(useOptionsStore, { newA: 'a' })) // @ts-expect-error: cannot use a getter -mapWritableState(useStore, ['upper']) +mapWritableState(useOptionsStore, ['upper']) // @ts-expect-error: cannot use a getter -mapWritableState(useStore, { up: 'upper' }) +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']) From 61b47e89f6b12a99c5c8d2df2be642a434bdd115 Mon Sep 17 00:00:00 2001 From: Eduardo San Martin Morote Date: Thu, 28 Nov 2024 12:39:18 +0100 Subject: [PATCH 2/2] refactor: simplify types --- packages/pinia/src/mapHelpers.ts | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/packages/pinia/src/mapHelpers.ts b/packages/pinia/src/mapHelpers.ts index c2c2483886..4cb219008c 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,12 +464,11 @@ export function mapWritableState< S extends StateTree, G extends _GettersTree, A, - KeyMapper extends Record, - SS extends StateTree = Store, + KeyMapper extends Record>, >( useStore: StoreDefinition, keyMapper: KeyMapper -): Pick<_MapWritableStateObjectReturn, keyof KeyMapper> +): _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 @@ -483,12 +482,11 @@ export function mapWritableState< S extends StateTree, G extends _GettersTree, A, - Keys extends keyof S, - SS extends StateTree = Store, + Keys extends keyof UnwrapRef, >( useStore: StoreDefinition, keys: readonly Keys[] -): Pick<_MapWritableStateReturn, Keys> +): 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