🤖 Merge PR #46628 [zen-observable] Add zen observable esm entry point by @BenoitZugmeyer

* [zen-observable] apply prettier

* [zen-observable] add zen-observable/esm module types

This commit add support for importing "zen-observable/esm".  Contrary to importing "zen-observable" directly, it
doesn't expose the global namespace ZenObservable.  Instead, it exports types directly.

* [zen-observable] re-export types from the entrypoint

Instead of declaring types in the 'esm' definitions, keep them in 'index' and re-export them in 'esm'.

This commit also moves the 'extras' types in a separate module, to be closer to the upstream package.
This commit is contained in:
Benoît Zugmeyer 2020-09-05 15:01:12 +02:00 committed by GitHub
parent 89a11295bc
commit d277a9fae5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 215 additions and 23 deletions

14
types/zen-observable/esm.d.ts vendored Normal file
View File

@ -0,0 +1,14 @@
import Observable = require('.');
/**
* @see https://github.com/zenparsing/zen-observable/blob/master/esm.js
*/
export default Observable;
export { Observable };
export * from './extras';
export type SubscriptionObserver<T> = ZenObservable.SubscriptionObserver<T>;
export type Subscription = ZenObservable.Subscription;
export type Observer<T> = ZenObservable.Observer<T>;
export type Subscriber<T> = ZenObservable.Subscriber<T>;
export type ObservableLike<T> = ZenObservable.ObservableLike<T>;

97
types/zen-observable/extras.d.ts vendored Normal file
View File

@ -0,0 +1,97 @@
import Observable = require('.');
export function merge(): Observable<never>;
export function merge<A>(a: ZenObservable.ObservableLike<A>): Observable<A>;
export function merge<A, B>(a: ZenObservable.ObservableLike<A>, b: ZenObservable.ObservableLike<B>): Observable<A | B>;
export function merge<A, B, C>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
): Observable<A | B | C>;
export function merge<A, B, C, D>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
): Observable<A | B | C | D>;
export function merge<A, B, C, D, E>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
e: ZenObservable.ObservableLike<E>,
): Observable<A | B | C | D | E>;
export function merge<A, B, C, D, E, F>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
e: ZenObservable.ObservableLike<E>,
f: ZenObservable.ObservableLike<F>,
): Observable<A | B | C | D | E | F>;
export function merge<T>(...observables: Array<ZenObservable.ObservableLike<T>>): Observable<T>;
export function combineLatest(): Observable<never>;
export function combineLatest<A>(a: ZenObservable.ObservableLike<A>): Observable<[A]>;
export function combineLatest<A, B>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
): Observable<[A, B]>;
export function combineLatest<A, B, C>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
): Observable<[A, B, C]>;
export function combineLatest<A, B, C, D>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
): Observable<[A, B, C, D]>;
export function combineLatest<A, B, C, D, E>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
e: ZenObservable.ObservableLike<E>,
): Observable<[A, B, C, D, E]>;
export function combineLatest<A, B, C, D, E, F>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
e: ZenObservable.ObservableLike<E>,
f: ZenObservable.ObservableLike<F>,
): Observable<[A, B, C, D, E, F]>;
export function combineLatest<T>(...observables: Array<ZenObservable.ObservableLike<T>>): Observable<T[]>;
export function zip(): Observable<never>;
export function zip<A>(a: ZenObservable.ObservableLike<A>): Observable<[A]>;
export function zip<A, B>(a: ZenObservable.ObservableLike<A>, b: ZenObservable.ObservableLike<B>): Observable<[A, B]>;
export function zip<A, B, C>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
): Observable<[A, B, C]>;
export function zip<A, B, C, D>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
): Observable<[A, B, C, D]>;
export function zip<A, B, C, D, E>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
e: ZenObservable.ObservableLike<E>,
): Observable<[A, B, C, D, E]>;
export function zip<A, B, C, D, E, F>(
a: ZenObservable.ObservableLike<A>,
b: ZenObservable.ObservableLike<B>,
c: ZenObservable.ObservableLike<C>,
d: ZenObservable.ObservableLike<D>,
e: ZenObservable.ObservableLike<E>,
f: ZenObservable.ObservableLike<F>,
): Observable<[A, B, C, D, E, F]>;
export function zip<T>(...observables: Array<ZenObservable.ObservableLike<T>>): Observable<T[]>;

View File

@ -3,6 +3,7 @@
// Definitions by: Kombu <https://github.com/aicest>
// JounQin <https://github.com/JounQin>
// Thomas <https://github.com/itomtom>
// BenoitZugmeyer <https://github.com/BenoitZugmeyer>
// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped
declare global {
@ -40,10 +41,14 @@ declare global {
}
declare class Observable<T> {
constructor(subscriber: ZenObservable.Subscriber<T>)
constructor(subscriber: ZenObservable.Subscriber<T>);
subscribe(observer: ZenObservable.Observer<T>): ZenObservable.Subscription;
subscribe(onNext: (value: T) => void, onError?: (error: any) => void, onComplete?: () => void): ZenObservable.Subscription;
subscribe(
onNext: (value: T) => void,
onError?: (error: any) => void,
onComplete?: () => void,
): ZenObservable.Subscription;
[Symbol.observable](): Observable<T>;
@ -59,7 +64,6 @@ declare class Observable<T> {
static of<R>(...items: R[]): Observable<R>;
}
declare namespace Observable {
}
declare namespace Observable {}
export = Observable;

View File

@ -0,0 +1,83 @@
import Observable, { Subscription, SubscriptionObserver, zip, combineLatest, merge } from 'zen-observable/esm';
// $ExpectType Subscription
let subscription = new Observable<number>(
(
// $ExpectType SubscriptionObserver<number>
observer,
) => {
observer.next(1);
observer.complete();
},
).subscribe(
(
// $ExpectType number
val,
) => {},
);
// zip
zip(Observable.of(1, 2, 3), Observable.of('a', 'b', 'c')).subscribe(
(
// $ExpectType [number, string]
val,
) => {},
);
zip().subscribe(
(
// $ExpectType never
val,
) => {},
);
zip(...[Observable.of(1)]).subscribe(
(
// $ExpectType number[]
val,
) => {},
);
// merge
merge(Observable.of(1, 2, 3), Observable.of('a', 'b', 'c')).subscribe(
(
// $ExpectType string | number
val,
) => {},
);
merge().subscribe(
(
// $ExpectType never
val,
) => {},
);
merge(...[Observable.of(1)]).subscribe(
(
// $ExpectType number
val,
) => {},
);
// combineLatest
combineLatest(Observable.of(1, 2, 3), Observable.of('a', 'b', 'c')).subscribe(
(
// $ExpectType [number, string]
val,
) => {},
);
combineLatest().subscribe(
(
// $ExpectType never
val,
) => {},
);
combineLatest(...[Observable.of(1)]).subscribe(
(
// $ExpectType number[]
val,
) => {},
);

View File

@ -13,25 +13,21 @@ function assert(val: boolean) {
new Observable<number>(observer => {
[1, 2, 3].forEach(one => observer.next(one));
observer.complete();
})
.subscribe(val => assert(typeof val === 'number'));
}).subscribe(val => assert(typeof val === 'number'));
/**
* Observable.of
*/
Observable.of(1, 2, 3)
.subscribe(val => assert(typeof val === 'number'));
Observable.of(1, 2, 3).subscribe(val => assert(typeof val === 'number'));
/**
* Observable.from
*/
Observable.from(Observable.of(1, 2, 3))
.subscribe(val => assert(typeof val === 'number'));
Observable.from(Observable.of(1, 2, 3)).subscribe(val => assert(typeof val === 'number'));
Observable.from([1, 2, 3])
.subscribe(val => assert(typeof val === 'number'));
Observable.from([1, 2, 3]).subscribe(val => assert(typeof val === 'number'));
Observable.from({
subscribe(observer: ZenObservable.SubscriptionObserver<number>) {
@ -40,23 +36,20 @@ Observable.from({
},
[Symbol.observable](this: ZenObservable.ObservableLike<number>) {
return this;
}
})
.subscribe(val => assert(typeof val === 'number'));
},
}).subscribe(val => assert(typeof val === 'number'));
Observable.from({
[Symbol.observable]() {
return Observable.of(1, 2, 3);
}
})
.subscribe(val => assert(typeof val === 'number'));
},
}).subscribe(val => assert(typeof val === 'number'));
/**
* observable.forEach
*/
Observable.of(1, 2, 3)
.forEach(val => assert(typeof val === 'number'));
Observable.of(1, 2, 3).forEach(val => assert(typeof val === 'number'));
/**
* observable.map
@ -99,8 +92,8 @@ Observable.of(1, 2, 3)
*/
Observable.of(1, 2, 3)
.concat(Observable.of(4, 5, 6), Observable.of(7, 8, 9))
.subscribe(val => assert(typeof val === 'number'));
.concat(Observable.of(4, 5, 6), Observable.of(7, 8, 9))
.subscribe(val => assert(typeof val === 'number'));
/**
* ZenObservable

View File

@ -18,6 +18,7 @@
},
"files": [
"index.d.ts",
"zen-observable-tests.ts"
"test/index.ts",
"test/esm.ts"
]
}