From: Eduardo San Martin Morote Date: Tue, 6 Apr 2021 18:53:47 +0000 (+0200) Subject: feat: mapState with object X-Git-Tag: v2.0.0-alpha.11~22 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=06805db9b4526cc0741016e0632cd6fb353a9728;p=thirdparty%2Fvuejs%2Fpinia.git feat: mapState with object --- diff --git a/__tests__/mapHelpers.spec.ts b/__tests__/mapHelpers.spec.ts index 4cd6410c..1869554a 100644 --- a/__tests__/mapHelpers.spec.ts +++ b/__tests__/mapHelpers.spec.ts @@ -135,6 +135,14 @@ describe('Map Helpers', () => { ) }) + it('object', async () => { + await testComponent( + mapState(useStore, { count: 'n', myA: 'a' }), + `{{ count }} {{ myA }}`, + `0 true` + ) + }) + it('getters', async () => { await testComponent( mapState(useStore, ['double', 'notA', 'a']), diff --git a/src/mapHelpers.ts b/src/mapHelpers.ts index 52ee8bac..b8ae0a97 100644 --- a/src/mapHelpers.ts +++ b/src/mapHelpers.ts @@ -54,19 +54,55 @@ export function mapStores( } type MapStateReturn = { - [s in keyof S | keyof G]: () => Store + [key in keyof S | keyof G]: () => Store[key] +} + +type MapStateObjectReturn< + S extends StateTree, + G, + T extends Record +> = { + [key in keyof T]: () => Store[T[key]] } export function mapState( useStore: StoreDefinition, keys: Array -): MapStateReturn { - return keys.reduce((reduced, key) => { - reduced[key] = function () { - return useStore((this as any).$pinia)[key] - } - return reduced - }, {} as MapStateReturn) +): MapStateReturn +export function mapState< + Id extends string, + S extends StateTree, + G, + A, + KeyMapper extends Record +>( + useStore: StoreDefinition, + keyMapper: KeyMapper +): MapStateObjectReturn +export function mapState< + Id extends string, + S extends StateTree, + G, + A, + KeyMapper extends Record +>( + useStore: StoreDefinition, + keysOrMapper: Array | KeyMapper +): MapStateReturn | MapStateObjectReturn { + return Array.isArray(keysOrMapper) + ? keysOrMapper.reduce((reduced, key) => { + // @ts-ignore: too complicated for TS + reduced[key] = function () { + return useStore((this as any).$pinia)[key] + } + return reduced + }, {} as MapStateReturn) + : Object.keys(keysOrMapper).reduce((reduced, key: keyof KeyMapper) => { + reduced[key] = function () { + return useStore((this as any).$pinia)[keysOrMapper[key]] + } + return reduced + }, {} as MapStateObjectReturn) } /**