【问题标题】:How to transform an object of Promise to object of Observable and still have typescript typings?如何将 Promise 的对象转换为 Observable 的对象并且仍然有打字稿类型?
【发布时间】:2020-02-17 09:09:49
【问题描述】:

我有一个 Promise 的对象。我喜欢将它们全部转换为可观察的(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'))

有什么想法吗?

【问题讨论】:

    标签: typescript promise rxjs typescript-typings


    【解决方案1】:

    因此,如果我对这个问题的理解是正确的,您希望将包含返回承诺的函数的对象映射到返回可观察的函数。

    您可以使用映射类型来映射原始类型的属性和条件类型来提取参数和结果类型,然后使用它来创建新的函数签名:

    
    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
    }
    
    

    函数本身需要正确调用promise函数并返回observable:

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

    Play

    【讨论】:

    • 硬核答案。
    • 这正是我想要的。我不知道“推断”。谢谢
    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-10-10
    • 2021-07-24
    • 2017-02-11
    • 2012-09-05
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多