From 7e50e35161de5bbf667d35b9a2ae39302bed72a4 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 6 Sep 2024 11:36:53 +0800 Subject: [PATCH 1/2] Fix `makePersisted` type narrowing --- .changeset/make-persisted-type-narrowing.md | 5 ++++ packages/storage/src/persisted.ts | 31 ++++++++++++--------- 2 files changed, 23 insertions(+), 13 deletions(-) create mode 100644 .changeset/make-persisted-type-narrowing.md diff --git a/.changeset/make-persisted-type-narrowing.md b/.changeset/make-persisted-type-narrowing.md new file mode 100644 index 000000000..be60e1520 --- /dev/null +++ b/.changeset/make-persisted-type-narrowing.md @@ -0,0 +1,5 @@ +--- +"@solid-primitives/storage": patch +--- + +Fix `makePersisted` type narrowing diff --git a/packages/storage/src/persisted.ts b/packages/storage/src/persisted.ts index b1b9de012..70689e0ad 100644 --- a/packages/storage/src/persisted.ts +++ b/packages/storage/src/persisted.ts @@ -70,12 +70,17 @@ export type PersistenceOptions | undefined> = { storageOptions?: O; }); +export type SignalInput = Signal | [Store, SetStoreFunction]; + export type SignalType | [Store, SetStoreFunction]> = S extends Signal ? T : S extends [Store, SetStoreFunction] ? T : never; -export type PersistedState = - | [get: Accessor, set: Setter, init: Promise | string | null] - | [get: Store, set: SetStoreFunction, init: Promise | string | null]; +export type PersistedState = + S extends Signal + ? [get: Accessor, set: Setter, init: Promise | string | null] + : S extends [Store, SetStoreFunction] + ? [get: Store, set: SetStoreFunction, init: Promise | string | null] + : never; /** * Persists a signal, store or similar API @@ -97,26 +102,26 @@ export type PersistedState = * @param {PersistenceOptions} options - The options for persistence. * @returns {PersistedState} - The persisted signal or store. */ -export function makePersisted | [Store, SetStoreFunction]>( +export function makePersisted( signal: S, options?: PersistenceOptions, undefined>, -): PersistedState>; -export function makePersisted< - S extends Signal | [Store, SetStoreFunction], - O extends Record, ->(signal: S, options: PersistenceOptions, O>): PersistedState>; +): PersistedState; +export function makePersisted>( + signal: S, + options: PersistenceOptions, O>, +): PersistedState; export function makePersisted< - S extends Signal | [Store, SetStoreFunction], + S extends SignalInput, O extends Record | undefined, T = SignalType, >( signal: S, options: PersistenceOptions = {} as PersistenceOptions, -): PersistedState> { +): PersistedState { const storage = options.storage || (globalThis.localStorage as Storage | undefined); const name = options.name || `storage-${createUniqueId()}`; if (!storage) { - return [signal[0], signal[1], null]; + return [signal[0], signal[1], null] as PersistedState; } const storageOptions = (options as unknown as { storageOptions: O }).storageOptions; const serialize: (data: T) => string = options.serialize || JSON.stringify.bind(JSON); @@ -181,7 +186,7 @@ export function makePersisted< unchanged = false; }, init, - ] as PersistedState>; + ] as PersistedState; } /** From 2c29f1fb470b12ba6fa62dcb442de03a5c7e43a8 Mon Sep 17 00:00:00 2001 From: Tony Date: Fri, 6 Sep 2024 11:43:41 +0800 Subject: [PATCH 2/2] Make SignalType use SignalInput --- packages/storage/src/persisted.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/storage/src/persisted.ts b/packages/storage/src/persisted.ts index 70689e0ad..396db317f 100644 --- a/packages/storage/src/persisted.ts +++ b/packages/storage/src/persisted.ts @@ -72,7 +72,7 @@ export type PersistenceOptions | undefined> = { export type SignalInput = Signal | [Store, SetStoreFunction]; -export type SignalType | [Store, SetStoreFunction]> = +export type SignalType = S extends Signal ? T : S extends [Store, SetStoreFunction] ? T : never; export type PersistedState =