Обратите внимание, что ответ очень основан на мнении.
Прежде чем я покажу свое решение, я хочу поделиться с ним идеей. Итак, когда я работаю с TS, я ожидаю, что у меня будет как можно более строгих типов . Таким образом, использование any
, object
или чего-то подобного в данном контексте отвлекает. Я также хочу избежать лишнего приведения типов, потому что это где-то приведет к ошибке.
К счастью, TS очень умен, чтобы помочь мне с этой целью, потому что он может определять типы в зависимости от использования.
На основе этого мы можем построить что-то вроде этого:
Очень общий c класс, который может все, что нам нужно (его можно расширить с помощью передачи параметров для выборки, ведения журнала, счетчика всего, что вы need)
class HttpService {
get<TData, TResult>(url: string, data?: TData): Promise<TResult> {
return fetch(url, data)
.then(x => x.json())
.catch((err) => console.log(err));
}
}
Но этот класс не следует использовать напрямую. Я бы посоветовал создать более строгий и специализированный сервис, который будет изолировать выборку logi c и предоставлять строгие типы вместо обобщенных.
type User = {
name: string;
}
class MyDataService {
constructor(private readonly _transportService: HttpService) { }
fetchUserInfo(userId: number): Promise<User> {
return this._transportService.get('/some/url', userId);
}
}
Теперь я могу использовать MyDataService без приведения типов и угадывания типов. Еще одним преимуществом является то, что эту службу очень легко протестировать, потому что вы можете заменить транспортный модуль, как хотите.
Надеюсь, мой ответ вам помог.