Skip to content

Commit e520f1a

Browse files
committed
Fix createResource initial value inference
1 parent 878f94a commit e520f1a

2 files changed

Lines changed: 38 additions & 8 deletions

File tree

packages/solid/src/reactive/signal.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -577,19 +577,19 @@ function isPromise(v: any): v is Promise<any> {
577577
*
578578
* @description https://docs.solidjs.com/reference/basic-reactivity/create-resource
579579
*/
580-
export function createResource<T, R = unknown>(
581-
fetcher: ResourceFetcher<true, T, R>,
582-
options: InitializedResourceOptions<NoInfer<T>, true>
583-
): InitializedResourceReturn<T, R>;
580+
export function createResource<T, R = unknown, I = T>(
581+
fetcher: (k: true, info: ResourceFetcherInfo<T | I, R>) => T | Promise<T>,
582+
options: ResourceOptions<T | I, true> & { initialValue: I }
583+
): InitializedResourceReturn<T | I, R>;
584584
export function createResource<T, R = unknown>(
585585
fetcher: ResourceFetcher<true, T, R>,
586586
options?: ResourceOptions<NoInfer<T>, true>
587587
): ResourceReturn<T, R>;
588-
export function createResource<T, S, R = unknown>(
588+
export function createResource<T, S, R = unknown, I = T>(
589589
source: ResourceSource<S>,
590-
fetcher: ResourceFetcher<S, T, R>,
591-
options: InitializedResourceOptions<NoInfer<T>, S>
592-
): InitializedResourceReturn<T, R>;
590+
fetcher: (k: S, info: ResourceFetcherInfo<T | I, R>) => T | Promise<T>,
591+
options: ResourceOptions<T | I, S> & { initialValue: I }
592+
): InitializedResourceReturn<T | I, R>;
593593
export function createResource<T, S, R = unknown>(
594594
source: ResourceSource<S>,
595595
fetcher: ResourceFetcher<S, T, R>,

packages/solid/test/resource.type-tests.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,21 @@ type Equals<X, Y> =
5656
type Tests = Assert<Equals<ResourceActions["mutate"], Setter<number>>>;
5757
}
5858

59+
// without source
60+
// with fetcher, nullable initialValue
61+
{
62+
const resourceReturn = createResource(
63+
() => {
64+
return Promise.resolve(1);
65+
},
66+
{
67+
initialValue: null
68+
}
69+
);
70+
71+
type Tests = Assert<Equals<typeof resourceReturn, InitializedResourceReturn<number | null>>>;
72+
}
73+
5974
// without initialValue
6075
// with source, fetcher
6176
{
@@ -105,6 +120,21 @@ type Equals<X, Y> =
105120
);
106121
}
107122

123+
// with source, fetcher, nullable initialValue
124+
{
125+
const resourceReturn = createResource(
126+
() => 1,
127+
() => {
128+
return Promise.resolve(1);
129+
},
130+
{
131+
initialValue: null
132+
}
133+
);
134+
135+
type Tests = Assert<Equals<typeof resourceReturn, InitializedResourceReturn<number | null>>>;
136+
}
137+
108138
/* Resource type tests */
109139
{
110140
let resource!: Resource<string>;

0 commit comments

Comments
 (0)