Можно ли на angular/typescript сделать функцию, которая могла бы возвращать Promise если у неё было вызвано .then либо Observable, при подписке?

Да, на 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.