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

#typescript

#typescript

Вопрос:

Я пытаюсь создать функцию с типом возвращаемого значения в зависимости от того, был передан необязательный параметр (factory) или нет

  • если он был передан, то возвращаемый тип должен быть равен заводскому возвращаемому типу
  • в противном случае он должен быть любым

Я попытался сделать это следующим образом:

 type Factory<T> = (data: any) => T;

function getObject<T>(id: number, factory?: Factory<T>): Factory<T> extends undefined ? any : ReturnType<Factory<T>> {
  let obj; // some entity from db in real app
  return factory ? factory(obj) : obj;
}

getObject(1, () => new Date()).getDate();             // OK, treated as date
getObject(1, () => new String()).toLocaleLowerCase(); // OK, treated as string
getObject(1).anything; // ERROR, typescript treat it as {} instead of any 
  

но это работает не так, как ожидалось, когда я не передаю factory параметр. Как я могу это исправить?
https://stackblitz.com/edit/typescript-xci2gs

Комментарии:

1. Как эта подпись должна соотноситься с типами, которые вы описываете? Почему бы не использовать объединение объявлений?

Ответ №1:

Удалось исправить это, изменив подпись на

 function getObject<T extends Factory<any>>(id: number, factory?: T): T extends undefined ? any : ReturnType<T> {

  

Комментарии:

1. Вы также можете использовать перегрузки function getObject(id: number): any function getObject<T>(id: number, factory: Factory<T>): ReturnType<Factory<T>> function getObject<T>(id: number, factory?: Factory<T>): any { let obj; // some entity from db in real app return factory ? factory(obj) : obj; }