// https://github.com/microsoft/TypeScript/issues/40462#issuecomment-689879308 /// import { Observable } from './Observable'; import { Subscription } from './Subscription'; /** * Note: This will add Symbol.observable globally for all TypeScript users, * however, we are no longer polyfilling Symbol.observable */ declare global { interface SymbolConstructor { readonly observable: symbol; } } /** OPERATOR INTERFACES */ export interface UnaryFunction { (source: T): R; } export interface OperatorFunction extends UnaryFunction, Observable> {} export type FactoryOrValue = T | (() => T); export interface MonoTypeOperatorFunction extends OperatorFunction {} /** * A value and the time at which it was emitted. * * Emitted by the `timestamp` operator * * @see {@link timestamp} */ export interface Timestamp { value: T; /** * The timestamp. By default, this is in epoch milliseconds. * Could vary based on the timestamp provider passed to the operator. */ timestamp: number; } /** * A value emitted and the amount of time since the last value was emitted. * * Emitted by the `timeInterval` operator. * * @see {@link timeInterval} */ export interface TimeInterval { value: T; /** * The amount of time between this value's emission and the previous value's emission. * If this is the first emitted value, then it will be the amount of time since subscription * started. */ interval: number; } /** SUBSCRIPTION INTERFACES */ export interface Unsubscribable { unsubscribe(): void; } export type TeardownLogic = Subscription | Unsubscribable | (() => void) | void; export interface SubscriptionLike extends Unsubscribable { unsubscribe(): void; readonly closed: boolean; } /** * @deprecated Do not use. Most likely you want to use `ObservableInput`. Will be removed in v8. */ export type SubscribableOrPromise = Subscribable | Subscribable | PromiseLike | InteropObservable; /** OBSERVABLE INTERFACES */ export interface Subscribable { subscribe(observer: Partial>): Unsubscribable; } /** * Valid types that can be converted to observables. */ export type ObservableInput = | Observable | InteropObservable | AsyncIterable | PromiseLike | ArrayLike | Iterable | ReadableStreamLike; /** * @deprecated Renamed to {@link InteropObservable }. Will be removed in v8. */ export type ObservableLike = InteropObservable; /** * An object that implements the `Symbol.observable` interface. */ export interface InteropObservable { [Symbol.observable]: () => Subscribable; } /** NOTIFICATIONS */ /** * A notification representing a "next" from an observable. * Can be used with {@link dematerialize}. */ export interface NextNotification { /** The kind of notification. Always "N" */ kind: 'N'; /** The value of the notification. */ value: T; } /** * A notification representing an "error" from an observable. * Can be used with {@link dematerialize}. */ export interface ErrorNotification { /** The kind of notification. Always "E" */ kind: 'E'; error: any; } /** * A notification representing a "completion" from an observable. * Can be used with {@link dematerialize}. */ export interface CompleteNotification { kind: 'C'; } /** * Valid observable notification types. */ export type ObservableNotification = NextNotification | ErrorNotification | CompleteNotification; /** OBSERVER INTERFACES */ export interface NextObserver { closed?: boolean; next: (value: T) => void; error?: (err: any) => void; complete?: () => void; } export interface ErrorObserver { closed?: boolean; next?: (value: T) => void; error: (err: any) => void; complete?: () => void; } export interface CompletionObserver { closed?: boolean; next?: (value: T) => void; error?: (err: any) => void; complete: () => void; } export type PartialObserver = NextObserver | ErrorObserver | CompletionObserver; export interface Observer { next: (value: T) => void; error: (err: any) => void; complete: () => void; } export interface SubjectLike extends Observer, Subscribable {} /** SCHEDULER INTERFACES */ export interface SchedulerLike extends TimestampProvider { schedule(work: (this: SchedulerAction, state: T) => void, delay: number, state: T): Subscription; schedule(work: (this: SchedulerAction, state?: T) => void, delay: number, state?: T): Subscription; schedule(work: (this: SchedulerAction, state?: T) => void, delay?: number, state?: T): Subscription; } export interface SchedulerAction extends Subscription { schedule(state?: T, delay?: number): Subscription; } /** * This is a type that provides a method to allow RxJS to create a numeric timestamp */ export interface TimestampProvider { /** * Returns a timestamp as a number. * * This is used by types like `ReplaySubject` or operators like `timestamp` to calculate * the amount of time passed between events. */ now(): number; } /** * Extracts the type from an `ObservableInput`. If you have * `O extends ObservableInput` and you pass in `Observable`, or * `Promise`, etc, it will type as `number`. */ export type ObservedValueOf = O extends ObservableInput ? T : never; /** * Extracts a union of element types from an `ObservableInput[]`. * If you have `O extends ObservableInput[]` and you pass in * `Observable[]` or `Promise[]` you would get * back a type of `string`. * If you pass in `[Observable, Observable]` you would * get back a type of `string | number`. */ export type ObservedValueUnionFromArray = X extends Array> ? T : never; /** * @deprecated Renamed to {@link ObservedValueUnionFromArray}. Will be removed in v8. */ export type ObservedValuesFromArray = ObservedValueUnionFromArray; /** * Extracts a tuple of element types from an `ObservableInput[]`. * If you have `O extends ObservableInput[]` and you pass in * `[Observable, Observable]` you would get back a type * of `[string, number]`. */ export type ObservedValueTupleFromArray = { [K in keyof X]: ObservedValueOf }; /** * Used to infer types from arguments to functions like {@link forkJoin}. * So that you can have `forkJoin([Observable, PromiseLike]): Observable<[A, B]>` * et al. */ export type ObservableInputTuple = { [K in keyof T]: ObservableInput; }; /** * Constructs a new tuple with the specified type at the head. * If you declare `Cons` you will get back `[A, B, C]`. */ export type Cons = ((arg: X, ...rest: Y) => any) extends (...args: infer U) => any ? U : never; /** * Extracts the head of a tuple. * If you declare `Head<[A, B, C]>` you will get back `A`. */ export type Head = ((...args: X) => any) extends (arg: infer U, ...rest: any[]) => any ? U : never; /** * Extracts the tail of a tuple. * If you declare `Tail<[A, B, C]>` you will get back `[B, C]`. */ export type Tail = ((...args: X) => any) extends (arg: any, ...rest: infer U) => any ? U : never; /** * Extracts the generic value from an Array type. * If you have `T extends Array`, and pass a `string[]` to it, * `ValueFromArray` will return the actual type of `string`. */ export type ValueFromArray = A extends Array ? T : never; /** * Gets the value type from an {@link ObservableNotification}, if possible. */ export type ValueFromNotification = T extends { kind: 'N' | 'E' | 'C' } ? T extends NextNotification ? T extends { value: infer V } ? V : undefined : never : never; /** * A simple type to represent a gamut of "falsy" values... with a notable exception: * `NaN` is "falsy" however, it is not and cannot be typed via TypeScript. See * comments here: https://github.com/microsoft/TypeScript/issues/28682#issuecomment-707142417 */ export type Falsy = null | undefined | false | 0 | -0 | 0n | ''; export type TruthyTypesOf = T extends Falsy ? never : T; // We shouldn't rely on this type definition being available globally yet since it's // not necessarily available in every TS environment. interface ReadableStreamDefaultReaderLike { // HACK: As of TS 4.2.2, The provided types for the iterator results of a `ReadableStreamDefaultReader` // are significantly different enough from `IteratorResult` as to cause compilation errors. // The type at the time is `ReadableStreamDefaultReadResult`. read(): PromiseLike< | { done: false; value: T; } | { done: true; value?: undefined } >; releaseLock(): void; } /** * The base signature RxJS will look for to identify and use * a [ReadableStream](https://streams.spec.whatwg.org/#rs-class) * as an {@link ObservableInput} source. */ export interface ReadableStreamLike { getReader(): ReadableStreamDefaultReaderLike; } /** * An observable with a `connect` method that is used to create a subscription * to an underlying source, connecting it with all consumers via a multicast. */ export interface Connectable extends Observable { /** * (Idempotent) Calling this method will connect the underlying source observable to all subscribed consumers * through an underlying {@link Subject}. * @returns A subscription, that when unsubscribed, will "disconnect" the source from the connector subject, * severing notifications to all consumers. */ connect(): Subscription; }