rxjs - En TypeScript, ¿cómo puedo combinar un objeto de tipos de contenedor genéricos en un contenedor genérico de tipo objeto?
Estoy intentando crear una función que combine un objeto de rxjs.Observable en un único Observable.
Por ejemplo,
Supongamos que tengo un mapa de observables como el siguiente.
const fooObservable$: Observable<Foo> = createFooObservable();
const barObservable$: Observable<Bar> = createBarObservable();
// Type of observables would be
// { foo: Observable<Foo>, bar: Observable<Bar> }
// And, `keyof typeof observables` would be
// "foo" | "bar"
const observables = {
foo: fooObservable$,
bar: barObservable$,
};
¿Entonces cómo puedo hacer una función que combine observables de la siguiente manera?
// typeof merged$ would be
// Observable<{ foo: Foo, bar: Bar }>
const merged$ = merge(observables);
No puedo averiguar cómo definir la firma de tipo de la función merge()
Por favor, dame una respuesta si hay una buena manera de hacer esto.
Respuesta #1
En este ejemplo, M es Observable (pero realmente podría aplicarse a cualquier tipo genérico):
class M<A> {
value: A;
}
type Unpacked<T> = T extends M<infer U> ? U : never;
type MergeBody<T> = {
[P in keyof T]: Unpacked<T[P]>
}
function merge<T>(t: T): M<MergeBody<T>> {
...
}
Entonces, un ejemplo:
let o = {
a: new M<number>(),
b: new M<string>()
}
const m = merge(o)
// type checks!
let n: number = m.value.a
