Да, на Angular с использованием TypeScript вы можете создать функцию, которая будет возвращать Promise или Observable в зависимости от использования вызова .then или подписки.
Для этого вам нужно будет использовать TypeScript-обобщения (generics) и проверку типов при выборе соответствующего возвращаемого значения.
Вот пример такой функции:
function myFunction<T>(callback: () => void): Promise<T> | Observable<T> { if (callback && typeof callback.then === 'function') { return new Promise<T>((resolve, reject) => { callback.then((result: T) => { resolve(result); }, (error: any) => { reject(error); }); }); } else { return new Observable<T>((observer) => { callback(); observer.complete(); }); } }
В этом примере функция myFunction принимает колбэк-функцию callback и проверяет, имеет ли она метод .then. Если callback имеет метод .then, то функция возвращает Promise, который затем разрешается в случае успешного выполнения callback и отвергается в случае ошибки.
Если callback не имеет метода .then, то функция возвращает Observable, который выполняет колбэк-функцию и завершается с помощью метода complete.
Пример использования этой функции:
const myPromise = myFunction<string>(() => { // some async operation }).then((result) => { console.log(result); }).catch((error) => { console.error(error); }); const myObservable = myFunction<number>(() => { // some sync operation }); myObservable.subscribe({ next: (value) => { console.log(value); }, complete: () => { console.log('Completed'); } });
В приведенном примере мы объявляем две переменные - myPromise и myObservable. myPromise использует .then для обработки разрешения Promise, а myObservable использует метод subscribe для подписки на Observable.
Таким образом, вы можете создать функцию, которая возвращает либо Promise, либо Observable в зависимости от использования callback. Это дает вам гибкость выбора подходящего варианта работы с асинхронными операциями в Angular с использованием TypeScript.