В Typescript, как я могу объединить объект универсальных типов контейнеров в универсальный контейнер типа объектов? - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь сделать функцию, которая объединяет объект rxjs.Observable s в один Observable.

Например,

Предположим, у меня есть карта наблюдаемых, подобная следующей.

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()

Пожалуйста, дайте мне ответ, если есть хороший способ сделать это.

1 Ответ

0 голосов
/ 10 января 2019

В этом примере M равно Observable (но оно действительно может применяться к любому универсальному типу):

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...