typescript - 在 Typescript 中,如何将通用容器类型的对象合并到对象类型的通用容器中?

标签 typescript rxjs

我正在尝试创建一个函数,将 rxjs.Observable 的对象合并为单个 Observable

例如,

假设我有一个可观察到的 map ,如下所示。

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$,
};

那么我怎样才能创建一个合并可观察量的函数,如下所示?

// typeof merged$ would be
// Observable<{ foo: Foo, bar: Bar }>
const merged$ = merge(observables);

我不知道如何定义函数merge()的类型签名

如果有好的方法,请给我答案。

最佳答案

在此示例中,MObservable(但它实际上可以应用于任何泛型类型):

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>> {
    ...
}

然后是一个例子:

let o = {
    a: new M<number>(),
    b: new M<string>()
}

const m = merge(o)
// type checks!
let n: number = m.value.a

关于typescript - 在 Typescript 中,如何将通用容器类型的对象合并到对象类型的通用容器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54121459/

相关文章:

angular - HTTP拦截器发送相同的请求两次

angular - 'mat-form-field' 不是已知元素 - Angular 5 和 Material2

TypeScript:是否可以创建映射的联合类型?

typescript - Visual Studio 2013 未检测到 TypeScript 引用

http - RxJS 和 AngularJS HTTP - 我怎样才能做到这一点?

Angular2 记录 http 响应

Angular2 - *ngIf 和异步可观察对象

javascript - Firebase - 如何将 orderBy 添加到复合查询?

javascript - 为什么当不相关的状态发生变化时,我的 redux 容器会渲染?

reactjs - react typescript 。用对象填充数组状态时出现问题