Skip to content

Commit 8d1891a

Browse files
AvcharovthePunderWoman
authored andcommitted
refactor(core): improve linkedSignal type definitions, add debugName to options (#63346)
Add debugName for having ability to visualize linkedSignal name in devtools signal graph PR Close #63346
1 parent 0ebf1af commit 8d1891a

File tree

3 files changed

+23
-4
lines changed

3 files changed

+23
-4
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1156,6 +1156,7 @@ export function linkedSignal<S, D>(options: {
11561156
value: NoInfer<D>;
11571157
}) => D;
11581158
equal?: ValueEqualityFn<NoInfer<D>>;
1159+
debugName?: string;
11591160
}): WritableSignal<D>;
11601161

11611162
// @public

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

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ export function linkedSignal<S, D>(options: {
4242
source: () => S;
4343
computation: (source: NoInfer<S>, previous?: {source: NoInfer<S>; value: NoInfer<D>}) => D;
4444
equal?: ValueEqualityFn<NoInfer<D>>;
45+
debugName?: string;
4546
}): WritableSignal<D>;
4647

4748
export function linkedSignal<S, D>(
@@ -50,30 +51,35 @@ export function linkedSignal<S, D>(
5051
source: () => S;
5152
computation: ComputationFn<S, D>;
5253
equal?: ValueEqualityFn<D>;
54+
debugName?: string;
5355
}
5456
| (() => D),
55-
options?: {equal?: ValueEqualityFn<D>},
57+
options?: {equal?: ValueEqualityFn<D>; debugName?: string},
5658
): WritableSignal<D> {
5759
if (typeof optionsOrComputation === 'function') {
5860
const getter = createLinkedSignal<D, D>(
5961
optionsOrComputation,
6062
identityFn<D>,
6163
options?.equal,
6264
) as LinkedSignalGetter<D, D> & WritableSignal<D>;
63-
return upgradeLinkedSignalGetter(getter);
65+
return upgradeLinkedSignalGetter(getter, options?.debugName);
6466
} else {
6567
const getter = createLinkedSignal<S, D>(
6668
optionsOrComputation.source,
6769
optionsOrComputation.computation,
6870
optionsOrComputation.equal,
6971
);
70-
return upgradeLinkedSignalGetter(getter);
72+
return upgradeLinkedSignalGetter(getter, optionsOrComputation.debugName);
7173
}
7274
}
7375

74-
function upgradeLinkedSignalGetter<S, D>(getter: LinkedSignalGetter<S, D>): WritableSignal<D> {
76+
function upgradeLinkedSignalGetter<S, D>(
77+
getter: LinkedSignalGetter<S, D>,
78+
debugName?: string,
79+
): WritableSignal<D> {
7580
if (ngDevMode) {
7681
getter.toString = () => `[LinkedSignal: ${getter()}]`;
82+
getter[SIGNAL].debugName = debugName;
7783
}
7884

7985
const node = getter[SIGNAL] as LinkedSignalNode<S, D>;

packages/core/test/signals/linked_signal_spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,18 @@ describe('linkedSignal', () => {
4646
expect(firstLetterReadonly()).toBe('c');
4747
});
4848

49+
it('should support debugName in options object', () => {
50+
const options = signal(['apple', 'banana', 'fig']);
51+
const choice = linkedSignal({
52+
source: options,
53+
computation: (options) => options[0],
54+
debugName: 'TestChoice',
55+
});
56+
57+
expect(choice()).toBe('apple');
58+
expect(choice.toString()).toBe('[LinkedSignal: apple]');
59+
});
60+
4961
it('should update when the source changes', () => {
5062
const options = signal(['apple', 'banana', 'fig']);
5163
const choice = linkedSignal({

0 commit comments

Comments
 (0)