#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; }