Так что, если мое чтение этого вопроса верно, вы хотите отобразить объект, содержащий функции, возвращающие обещания, функциям, возвращающим наблюдаемый.
Вы можете заставить типы работать, используя сопоставленный тип, чтобы отобразить свойстваисходный тип и условный тип, чтобы извлечь параметры и тип результата, а затем использовать его для создания новой сигнатуры функции:
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'))
Воспроизвести