Как преобразовать объект Promise в объект Observable и при этом иметь машинописные наборы? - PullRequest
0 голосов
/ 21 октября 2019

У меня есть объект Обещания. Мне нравится преобразовывать все из них в наблюдаемые (rxjs), но я хочу продолжать печатать. Этот способ не работает:

const methods = {
    func1: (): Promise<boolean> => {
        return Promise.resolve(true)
    },
    func2: (num: number): Promise<number> => {
        return Promise.resolve(num)
    }
};

const mapItToObservable = (methods) => {
    return Object.keys(methods).reduce((acc, key) => {
        acc[key] = from(acc[key])
        return acc;
    }, {})
}

const methodsInObservable = mapItToObservable(methods)

methodsInObservable.func1.subscribe(d => console.log('d'))

Есть идеи?

1 Ответ

2 голосов
/ 21 октября 2019

Так что, если мое чтение этого вопроса верно, вы хотите отобразить объект, содержащий функции, возвращающие обещания, функциям, возвращающим наблюдаемый.

Вы можете заставить типы работать, используя сопоставленный тип, чтобы отобразить свойстваисходный тип и условный тип, чтобы извлечь параметры и тип результата, а затем использовать его для создания новой сигнатуры функции:


type MapToObservable<T extends Record<string, (...args: any[]) => Promise<any>>> = {
    [P in keyof T]: T[P] extends (...args: infer P) => Promise<infer R> ? (...args: P) => Observable<R> : never
}

Сама функция должна правильно вызывать функцию обещания и возвращать наблюдаемое:


const methods = {
    func1: (): Promise<boolean> => {
        return Promise.resolve(true)
    },
    func2: (num: number): Promise<number> => {
        return Promise.resolve(num)
    }
};

type MapToObservable<T extends Record<string, (...args: any[]) => Promise<any>>> = {
    [P in keyof T]: T[P] extends (...args: infer P) => Promise<infer R> ? (...args: P) => Observable<R> : never
}

const mapItToObservable = <T extends Record<string, (...args: any[]) => Promise<any>>>(methods: T) => {
    return Object.keys(methods).reduce((acc, key) => {
        acc[key] = function (...args: any[]) {
            return from(methods[key].call(this, ...args))
        }
        return acc;
    }, {} as Record<string, (...args: any[]) => Observable<any>>) as any as MapToObservable<T> ;
}

const methodsInObservable = mapItToObservable(methods)

methodsInObservable.func1().subscribe(d => console.log('d'))

Воспроизвести

...