Как создать новый объект универсального типа T

У меня есть следующий метод выполнения 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 для любого типа, переданного этому методу?

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

jonrsharpe 04.04.2021 10:50
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
22
0

Другие вопросы по теме