У меня есть следующий метод выполнения HTTP-запросов
export class CustomHttpClientService {
constructor(private http: HttpClient) {
}
public get<T>(route, header = {}) {
const sharedHeaders = {
Authorization: `Bearer ${localStorage.getItem(environment.jwtKey)}`,
'Content-Type': 'application/json; charset=UTF-8'
};
const httpOptions = {
headers: new HttpHeaders({ ...sharedHeaders, ...header }),
};
return this.http.get<T>(environment.serverLink + route, httpOptions).pipe<T>(
map((x: T) => {
return cloneDeep(x) as T;
})
);
}
}
Я ожидал от метода get, что он вернет объекты, которые являются экземпляром типа, переданного универсальному методу, но это не так.
Когда я выполняю следующий код:
export class CountriesCitiesComponent implements OnInit {
cities: Observable<CountryCity[]>;
constructor(private customHttp: CustomHttpClientService) { }
ngOnInit(): void {
this.cities = this.customHttp.get<CountryCity[]>("/city").pipe(
map((res: CountryCity[]) => {
console.info(res[0] instanceof CountryCity);
// More Code Here
})
);
}
}
Результат res[0] instanceof CountryCity всегда ложный. Я не могу найти способ сделать res экземпляром CountryCity внутри класса CustomHttpClientService.
Модуль CountryCity содержит декораторы, и я не могу получить доступ к свойствам декоратора из объекта res, если это не instanceof CountryCity.
export class CountryCity {
@Form(new FormDesign({ type: FormType.hidden }))
id: number;
@Form(new FormDesign({ placeholder: "Country id" }))
@Table(new TableDesign({ header: "Country ID" }))
country_id: number;
@Table(new TableDesign({ header: "Go To Google", action: TableClickAction.link, link: "https://www.google.com/" }))
__goToGoogle: string = '';
}
Я попробовал несколько онлайн-предложений по преобразованию типов объектов внутри CustomHttpClientService на основе полученного универсального типа, но ни одно из них у меня не сработало.
У меня сработало только одно решение. Мне удалось преобразовать тип объекта из Object в CountryCity, добавив следующий код в класс CountriesCitiesComponent.
export class CountriesCitiesComponent implements OnInit {
cities: Observable<CountryCity[]>;
constructor(private customHttp: CustomHttpClientService) { }
ngOnInit(): void {
this.cities = this.customHttp.get<CountryCity[]>("/city").pipe(
map((res: CountryCity[]) => {
for (let i = 0; i < res.length; i++) {
let t = new CountryCity();
Object.assign(t, res[i]);
res[i] = t;
}
console.info(res[0] instanceof CountryCity);
// More Code Here
})
);
}
}
В приведенном выше коде результат оператора console.info истинен. Проблема с приведенным выше кодом заключается в том, что процесс преобразования выполняется вне класса CustomHttpClientService. У меня есть много других модулей, кроме CountryCity, которые содержат декораторы, и я не хочу переписывать метод преобразования каждый раз, когда я вызываю метод CustomHttpClientService#get.
Как я могу вернуть объект универсального типа из CustomHttpClientService для любого типа, переданного этому методу?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Ни универсальный тип, ни утверждение типа не вызывают какой-либо проверки, преобразования или преобразования во время выполнения. Они не могут, все типы стираются во время компиляции. Вы должны обернуть настраиваемый клиент службами (например,
CityService), которые используют клиент для выполнения запроса, а затем применить процесс, который у вас уже есть, к результату.