Skip to content

Commit 1c7df81

Browse files
committed
improve createResource types
1 parent 23040ac commit 1c7df81

2 files changed

Lines changed: 12 additions & 5 deletions

File tree

packages/shadow-objects/src/in-the-dark/Kernel.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@ import type {
1919
ShadowObjectConstructor,
2020
ShadowObjectType,
2121
SyncEvent,
22+
Maybe,
2223
} from '../types.js';
2324
import {ConsoleLogger} from '../utils/ConsoleLogger.js';
25+
import {toMaybe} from '../utils/toMaybe.js';
2426
import {Entity} from './Entity.js';
2527
import {type OnCreate, onCreate, type OnDestroy, onDestroy, onParentChanged} from './events.js';
2628
import {Registry} from './Registry.js';
@@ -486,12 +488,16 @@ export class Kernel {
486488
return result;
487489
},
488490

489-
createResource<T>(factory: () => T | undefined, cleanup?: (resource: T) => void): Signal<T | undefined> {
490-
const resourceSignal = createSignal<T | undefined>(undefined);
491-
unsubscribeSecondary.add(() => destroySignal(resourceSignal));
491+
createResource<T>(factory: () => T | undefined, cleanup?: (resource: NonNullable<T>) => any): Signal<Maybe<T>> {
492+
const resourceSignal = createSignal<Maybe<T>>();
493+
494+
unsubscribeSecondary.add(() => {
495+
resourceSignal.set(undefined);
496+
destroySignal(resourceSignal);
497+
});
492498

493499
const effect = createEffect(() => {
494-
const resource = factory();
500+
const resource = toMaybe(factory());
495501
resourceSignal.set(resource);
496502

497503
if (resource !== undefined && cleanup) {
@@ -504,6 +510,7 @@ export class Kernel {
504510
resourceSignal.set(undefined);
505511
};
506512
});
513+
507514
unsubscribeSecondary.add(effect.destroy);
508515

509516
return resourceSignal;

packages/shadow-objects/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export interface ShadowObjectCreationAPI {
121121
useProperty<T = unknown>(name: string, isEqual?: CompareFunc<T>): SignalReader<Maybe<T>>;
122122
useProperties<K extends string>(props: Record<K, string>): Record<K, SignalReader<any>>;
123123

124-
createResource<T = unknown>(factory: () => Maybe<T>, cleanup?: (resource: NonNullable<T>) => any): Signal<Maybe<T>>;
124+
createResource<T = unknown>(factory: () => T | undefined, cleanup?: (resource: NonNullable<T>) => any): Signal<Maybe<T>>;
125125

126126
createEffect(...args: Parameters<typeof createEffect>): ReturnType<typeof createEffect>;
127127
createSignal<T = unknown>(...args: Parameters<typeof createSignal<T>>): ReturnType<typeof createSignal<T>>;

0 commit comments

Comments
 (0)