Skip to content

Commit

Permalink
Fix makePersisted type narrowing (#685)
Browse files Browse the repository at this point in the history
  • Loading branch information
atk authored Sep 6, 2024
2 parents fa9ffdf + 2c29f1f commit 358c7ea
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 14 deletions.
5 changes: 5 additions & 0 deletions .changeset/make-persisted-type-narrowing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@solid-primitives/storage": patch
---

Fix `makePersisted` type narrowing
33 changes: 19 additions & 14 deletions packages/storage/src/persisted.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,12 +70,17 @@ export type PersistenceOptions<T, O extends Record<string, any> | undefined> = {
storageOptions?: O;
});

export type SignalType<S extends Signal<any> | [Store<any>, SetStoreFunction<any>]> =
export type SignalInput = Signal<any> | [Store<any>, SetStoreFunction<any>];

export type SignalType<S extends SignalInput> =
S extends Signal<infer T> ? T : S extends [Store<infer T>, SetStoreFunction<infer T>] ? T : never;

export type PersistedState<T> =
| [get: Accessor<T>, set: Setter<T>, init: Promise<string> | string | null]
| [get: Store<T>, set: SetStoreFunction<T>, init: Promise<string> | string | null];
export type PersistedState<S extends SignalInput> =
S extends Signal<infer T>
? [get: Accessor<T>, set: Setter<T>, init: Promise<string> | string | null]
: S extends [Store<infer T>, SetStoreFunction<infer T>]
? [get: Store<T>, set: SetStoreFunction<T>, init: Promise<string> | string | null]
: never;

/**
* Persists a signal, store or similar API
Expand All @@ -97,26 +102,26 @@ export type PersistedState<T> =
* @param {PersistenceOptions<T, O>} options - The options for persistence.
* @returns {PersistedState<T>} - The persisted signal or store.
*/
export function makePersisted<S extends Signal<any> | [Store<any>, SetStoreFunction<any>]>(
export function makePersisted<S extends SignalInput>(
signal: S,
options?: PersistenceOptions<SignalType<S>, undefined>,
): PersistedState<SignalType<S>>;
export function makePersisted<
S extends Signal<any> | [Store<any>, SetStoreFunction<any>],
O extends Record<string, any>,
>(signal: S, options: PersistenceOptions<SignalType<S>, O>): PersistedState<SignalType<S>>;
): PersistedState<S>;
export function makePersisted<S extends SignalInput, O extends Record<string, any>>(
signal: S,
options: PersistenceOptions<SignalType<S>, O>,
): PersistedState<S>;
export function makePersisted<
S extends Signal<any> | [Store<any>, SetStoreFunction<any>],
S extends SignalInput,
O extends Record<string, any> | undefined,
T = SignalType<S>,
>(
signal: S,
options: PersistenceOptions<T, O> = {} as PersistenceOptions<T, O>,
): PersistedState<SignalType<S>> {
): PersistedState<S> {
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<S>;
}
const storageOptions = (options as unknown as { storageOptions: O }).storageOptions;
const serialize: (data: T) => string = options.serialize || JSON.stringify.bind(JSON);
Expand Down Expand Up @@ -181,7 +186,7 @@ export function makePersisted<
unchanged = false;
},
init,
] as PersistedState<SignalType<S>>;
] as PersistedState<S>;
}

/**
Expand Down

0 comments on commit 358c7ea

Please sign in to comment.