From: Eduardo San Martin Morote Date: Wed, 28 Jul 2021 09:17:05 +0000 (+0200) Subject: fix(types): stricter types for mapState X-Git-Tag: v2.0.0-rc.0~14 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f702356a5549dfe184c4d3805757c494a7088b19;p=thirdparty%2Fvuejs%2Fpinia.git fix(types): stricter types for mapState --- diff --git a/src/mapHelpers.ts b/src/mapHelpers.ts index 43f24680..600c0fb8 100644 --- a/src/mapHelpers.ts +++ b/src/mapHelpers.ts @@ -122,15 +122,17 @@ export function mapStores( /** * @internal */ -export type _MapStateReturn> = { +export type _MapStateReturn< + S extends StateTree, + G extends GettersTree, + Keys extends keyof S | keyof G = keyof S | keyof G +> = { // [key in keyof S | keyof G]: () => key extends keyof S // ? S[key] // : key extends keyof G // ? G[key] // : never - [key in keyof S | keyof G]: () => key extends keyof Store - ? Store[key] - : never + [key in Keys]: () => Store[key] } /** @@ -144,7 +146,7 @@ export type _MapStateObjectReturn< T extends Record< string, keyof S | keyof G | ((store: Store) => any) - > + > = {} > = { [key in keyof T]: () => T[key] extends (store: any) => infer R ? R @@ -230,11 +232,12 @@ export function mapState< Id extends string, S extends StateTree, G extends GettersTree, - A + A, + Keys extends keyof S | keyof G >( useStore: StoreDefinition, - keys: Array -): _MapStateReturn + keys: readonly Keys[] +): _MapStateReturn /** * Allows using state and getters from one store without using the composition @@ -248,15 +251,11 @@ export function mapState< Id extends string, S extends StateTree, G extends GettersTree, - A, - KeyMapper extends Record< - string, - keyof S | keyof G | ((store: Store) => any) - > + A >( useStore: StoreDefinition, - keysOrMapper: Array | KeyMapper -): _MapStateReturn | _MapStateObjectReturn { + keysOrMapper: any +): _MapStateReturn | _MapStateObjectReturn { return Array.isArray(keysOrMapper) ? keysOrMapper.reduce((reduced, key) => { reduced[key] = function (this: ComponentPublicInstance) { @@ -264,7 +263,8 @@ export function mapState< } as () => any return reduced }, {} as _MapStateReturn) - : Object.keys(keysOrMapper).reduce((reduced, key: keyof KeyMapper) => { + : Object.keys(keysOrMapper).reduce((reduced, key: string) => { + // @ts-expect-error reduced[key] = function (this: ComponentPublicInstance) { const store = useStore(this.$pinia) const storeKey = keysOrMapper[key] @@ -272,11 +272,10 @@ export function mapState< // function return typeof storeKey === 'function' ? (storeKey as (store: Store) => any).call(this, store) - : // @ts-expect-error - store[storeKey] + : store[storeKey] } return reduced - }, {} as _MapStateObjectReturn) + }, {} as _MapStateObjectReturn) } /** diff --git a/test-dts/mapHelpers.test-d.ts b/test-dts/mapHelpers.test-d.ts index 9f7248cf..991991fd 100644 --- a/test-dts/mapHelpers.test-d.ts +++ b/test-dts/mapHelpers.test-d.ts @@ -56,9 +56,12 @@ expectType<{ upper: () => string }>(mapState(useStore, ['a', 'upper'])) -// FIXME: @ts-expect-error +// @ts-expect-error mapState(useStore, ['a']).nested +// @ts-expect-error +mapState(useStore, ['a', 'upper']).nested + expectType<{ newA: () => 'on' | 'off' newUpper: () => string