Skip to content

Commit 9e850c8

Browse files
tsc036kirjs
authored andcommitted
refactor(core): Refactor createSignal to return a tuple contain getter, setter, and updater (#61705)
Refactor createSignal to return a tuple instead of a signal getter. createSignalTuple will be removed in a follow up pr once createSignalTuple usages in google3 are migrated to createSignal. PR Close #61705
1 parent 3710b12 commit 9e850c8

File tree

3 files changed

+16
-15
lines changed

3 files changed

+16
-15
lines changed

goldens/public-api/core/primitives/signals/index.api.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ export function createComputed<T>(computation: () => T, equal?: ValueEqualityFn<
4141
export function createLinkedSignal<S, D>(sourceFn: () => S, computationFn: ComputationFn<S, D>, equalityFn?: ValueEqualityFn<D>): LinkedSignalGetter<S, D>;
4242

4343
// @public
44-
export function createSignal<T>(initialValue: T, equal?: ValueEqualityFn<T>): SignalGetter<T>;
44+
export function createSignal<T>(initialValue: T, equal?: ValueEqualityFn<T>): [SignalGetter<T>, SignalSetter<T>, SignalUpdater<T>];
4545

46-
// @public
46+
// @public @deprecated
4747
export function createSignalTuple<T>(initialValue: T, equal?: ValueEqualityFn<T>): [SignalGetter<T>, SignalSetter<T>, SignalUpdater<T>];
4848

4949
// @public (undocumented)

packages/core/primitives/signals/src/signal.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,12 @@ export interface SignalGetter<T> extends SignalBaseGetter<T> {
4848
}
4949

5050
/**
51-
* Create a `Signal` that can be set or updated directly.
51+
* Creates a `Signal` getter, setter, and updater function.
5252
*/
53-
export function createSignal<T>(initialValue: T, equal?: ValueEqualityFn<T>): SignalGetter<T> {
53+
export function createSignal<T>(
54+
initialValue: T,
55+
equal?: ValueEqualityFn<T>,
56+
): [SignalGetter<T>, SignalSetter<T>, SignalUpdater<T>] {
5457
const node: SignalNode<T> = Object.create(SIGNAL_NODE);
5558
node.value = initialValue;
5659
if (equal !== undefined) {
@@ -64,22 +67,20 @@ export function createSignal<T>(initialValue: T, equal?: ValueEqualityFn<T>): Si
6467
}
6568

6669
runPostProducerCreatedFn(node);
67-
68-
return getter;
70+
const set = (newValue: T) => signalSetFn(node, newValue);
71+
const update = (updateFn: (value: T) => T) => signalUpdateFn(node, updateFn);
72+
return [getter, set, update];
6973
}
7074

7175
/**
7276
* Creates a `Signal` getter, setter, and updater function.
77+
* @deprecated use createSignal
7378
*/
7479
export function createSignalTuple<T>(
7580
initialValue: T,
7681
equal?: ValueEqualityFn<T>,
7782
): [SignalGetter<T>, SignalSetter<T>, SignalUpdater<T>] {
78-
const getter = createSignal(initialValue, equal);
79-
const node = getter[SIGNAL];
80-
const set = (newValue: T) => signalSetFn(node, newValue);
81-
const update = (updateFn: (value: T) => T) => signalUpdateFn(node, updateFn);
82-
return [getter, set, update];
83+
return createSignal(initialValue, equal);
8384
}
8485

8586
export function setPostSignalSetFn(fn: ReactiveHookFn | null): ReactiveHookFn | null {

packages/core/src/render3/reactivity/signal.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,13 @@ export interface CreateSignalOptions<T> {
7676
* Create a `Signal` that can be set or updated directly.
7777
*/
7878
export function signal<T>(initialValue: T, options?: CreateSignalOptions<T>): WritableSignal<T> {
79-
const signalFn = createSignal(initialValue, options?.equal) as SignalGetter<T> &
80-
WritableSignal<T>;
79+
const [get, set, update] = createSignal(initialValue, options?.equal);
8180

81+
const signalFn = get as SignalGetter<T> & WritableSignal<T>;
8282
const node = signalFn[SIGNAL];
8383

84-
signalFn.set = (newValue: T) => signalSetFn(node, newValue);
85-
signalFn.update = (updateFn: (value: T) => T) => signalUpdateFn(node, updateFn);
84+
signalFn.set = set;
85+
signalFn.update = update;
8686
signalFn.asReadonly = signalAsReadonlyFn.bind(signalFn as any) as () => Signal<T>;
8787

8888
if (ngDevMode) {

0 commit comments

Comments
 (0)