Skip to content

Commit d9bed48

Browse files
divdavempkozlowski-opensource
authored andcommitted
fix(core): extend toSignal to accept any Subscribable (#50162)
Extend toSignal to accept any Subscribable (instead of only Observable) for consistency with AsyncPipe and for broader compatibility with any observable library (that is compatible with the Subscribable interface). This is only a type change as the implementation does not use anything else than the Subscribable interface anyway. PR Close #50162
1 parent f48c0bc commit d9bed48

File tree

2 files changed

+12
-10
lines changed

2 files changed

+12
-10
lines changed

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { Injector } from '@angular/core';
99
import { MonoTypeOperatorFunction } from 'rxjs';
1010
import { Observable } from 'rxjs';
1111
import { Signal } from '@angular/core';
12+
import { Subscribable } from 'rxjs';
1213

1314
// @public
1415
export function takeUntilDestroyed<T>(destroyRef?: DestroyRef): MonoTypeOperatorFunction<T>;
@@ -22,21 +23,21 @@ export interface ToObservableOptions {
2223
}
2324

2425
// @public
25-
export function toSignal<T>(source: Observable<T>): Signal<T | undefined>;
26+
export function toSignal<T>(source: Observable<T> | Subscribable<T>): Signal<T | undefined>;
2627

2728
// @public
28-
export function toSignal<T>(source: Observable<T>, options?: ToSignalOptions<undefined> & {
29+
export function toSignal<T>(source: Observable<T> | Subscribable<T>, options?: ToSignalOptions<undefined> & {
2930
requireSync?: false;
3031
}): Signal<T | undefined>;
3132

3233
// @public
33-
export function toSignal<T, U extends T | null | undefined>(source: Observable<T>, options: ToSignalOptions<U> & {
34+
export function toSignal<T, U extends T | null | undefined>(source: Observable<T> | Subscribable<T>, options: ToSignalOptions<U> & {
3435
initialValue: U;
3536
requireSync?: false;
3637
}): Signal<T | U>;
3738

3839
// @public
39-
export function toSignal<T>(source: Observable<T>, options: ToSignalOptions<undefined> & {
40+
export function toSignal<T>(source: Observable<T> | Subscribable<T>, options: ToSignalOptions<undefined> & {
4041
requireSync: true;
4142
}): Signal<T>;
4243

packages/core/rxjs-interop/src/to_signal.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*/
88

99
import {assertInInjectionContext, computed, DestroyRef, inject, Injector, signal, Signal, WritableSignal} from '@angular/core';
10-
import {Observable} from 'rxjs';
10+
import {Observable, Subscribable} from 'rxjs';
1111

1212
import {RuntimeError, RuntimeErrorCode} from '../../src/errors';
1313
import {untracked} from '../../src/signals';
@@ -73,7 +73,7 @@ export interface ToSignalOptions<T> {
7373
* option can be specified instead, which disables the automatic subscription teardown. No injection
7474
* context is needed in this configuration as well.
7575
*/
76-
export function toSignal<T>(source: Observable<T>): Signal<T|undefined>;
76+
export function toSignal<T>(source: Observable<T>|Subscribable<T>): Signal<T|undefined>;
7777

7878
/**
7979
* Get the current value of an `Observable` as a reactive `Signal`.
@@ -99,7 +99,7 @@ export function toSignal<T>(source: Observable<T>): Signal<T|undefined>;
9999
* @developerPreview
100100
*/
101101
export function toSignal<T>(
102-
source: Observable<T>,
102+
source: Observable<T>|Subscribable<T>,
103103
options?: ToSignalOptions<undefined>&{requireSync?: false}): Signal<T|undefined>;
104104

105105

@@ -127,7 +127,7 @@ export function toSignal<T>(
127127
* @developerPreview
128128
*/
129129
export function toSignal<T, U extends T|null|undefined>(
130-
source: Observable<T>,
130+
source: Observable<T>|Subscribable<T>,
131131
options: ToSignalOptions<U>&{initialValue: U, requireSync?: false}): Signal<T|U>;
132132

133133
/**
@@ -154,9 +154,10 @@ export function toSignal<T, U extends T|null|undefined>(
154154
* @developerPreview
155155
*/
156156
export function toSignal<T>(
157-
source: Observable<T>, options: ToSignalOptions<undefined>&{requireSync: true}): Signal<T>;
157+
source: Observable<T>|Subscribable<T>,
158+
options: ToSignalOptions<undefined>&{requireSync: true}): Signal<T>;
158159
export function toSignal<T, U = undefined>(
159-
source: Observable<T>, options?: ToSignalOptions<U>): Signal<T|U> {
160+
source: Observable<T>|Subscribable<T>, options?: ToSignalOptions<U>): Signal<T|U> {
160161
const requiresCleanup = !options?.manualCleanup;
161162
requiresCleanup && !options?.injector && assertInInjectionContext(toSignal);
162163
const cleanupRef =

0 commit comments

Comments
 (0)