Как назначить данные forkJoin переменным? - PullRequest
0 голосов
/ 06 февраля 2019

У меня следующий класс:

class ExampleComponent {
    application: Application = new Application();
    company: Company;
    bank_account: BankAccount = new BankAccount();
    contact: Contact;
    director: Director = new Director();
    websites: Website[] = [];
    files: DirectorFile[] = [];
    director_files: DirectorFile[] = [];

    ngOnInit() {
        this.getApplication();
    }

    getApplication() {
        forkJoin([
             this.exampleRepo.getApplication(),
             this.exampleRepo.getCompany(),
             this.exampleRepo.getBankAccount(),
             this.exampleRepo.getContact(),
             this.exampleRepo.getDirector(),
             this.exampleRepo.getAllWebsites(),
             this.exampleRepo.getAllFiles(),
             this.exampleRepo.getDirectorFiles()
         ]).subscribe(
             (data: [
                 Application,
                 Company,
                 BankAccount,
                 Contact,
                 Director,
                 Website[],
                 DirectorFile[],
                 DirectorFile[]
             ]) => {
                 this.application = data[0];
                 this.company = data[1];
                 this.bank_account = data[2];
                 this.contact = data[3];
                 this.director = data[4];
                 this.websites = data[5];
                 this.files = data[6];
                 this.director_files = data[7];
             }
         );
    }
}

И я получаю следующую ошибку:

error TS2345: Argument of type '(data: [Application, Company, BankAccount, Contact, Director, Website[], DirectorFile[], DirectorFile[]]) => void' is not assignable to parameter of type '(value: (Observable<Application> | Observable<BankAccount> | Observable<Contact> | Observable<Company> | Observable<Director> | Observable<DirectorFile[]> | Observable<Website[]>)[]) => void'.
  Types of parameters 'data' and 'value' are incompatible.
    Type '(Observable<Application> | Observable<BankAccount> | Observable<Contact> | Observable<Company> | Observable<Director> | Observable<DirectorFile[]> | Observable<Website[]>)[]' is not assignable to type '[Application, Company, BankAccount, Contact, Director, Website[], DirectorFile[], DirectorFile[]]'.
      Property '0' is missing in type '(Observable<Application> | Observable<BankAccount> | Observable<Contact> | Observable<Company> | Observable<Director> | Observable<DirectorFile[]> | Observable<Website[]>)[]'.

Если я не указываю типы в данных и просто пишу: data => {...} Я получаю следующую ошибку:

error TS2322: Type 'Observable<Application> | Observable<BankAccount> | Observable<Contact> | Observable<Company> | Observable<Director> | Observable<DirectorFile[]> | Observable<Website[]>' is not assignable to type 'Application'.
  Type 'Observable<Application>' has no properties in common with type 'Application'.

Если я удаляю массив из forkJoin и просто добавляю 8 запросов в качестве отдельных параметров, я могу назначить данные переменным, но затем получаюошибка от linter и rxjs, говорящая, что forkjoin с resultSelector устарела.

Любая идея о том, как я могу назначить данные своим переменным.Как мне уничтожить массив Observables для объектов?

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Когда вы подписываетесь на forkjoin, вы получите массив данных, которые вы вызвали, чтобы избежать этого, и получите единственную наблюдаемую, вам просто нужно уничтожить массив данных, и ошибка intellisense должна исчезнуть, ваша ошибка передавала данные, а не разрушаемуюobservable:

    forkJoin(
      [
        this.service.getProvince(),
        this.service.getLingueStraniere(),
      ]).subscribe(
      ([Province, LingueStraniere]) => {
        this.province = Province;
        this.lingueStraniere = LingueStraniere;
      }
    ); 

Теперь ваш код должен выглядеть следующим образом:

forkJoin([
             this.exampleRepo.getApplication(),
             this.exampleRepo.getCompany(),
             this.exampleRepo.getBankAccount(),
             this.exampleRepo.getContact(),
             this.exampleRepo.getDirector(),
             this.exampleRepo.getAllWebsites(),
             this.exampleRepo.getAllFiles(),
             this.exampleRepo.getDirectorFiles()
         ]).subscribe(
             ([
                 application,
                 company,
                 bankAccount,
                 contact,
                 director,
                 website[],
                 directorFile[],
             ]) => {
                 this.application = application;
                 this.company = company;
                 this.bank_account = bankAccount;
                 this.contact = contact;
                 this.director = director;
                 this.websites = website[];
                 this.files = directorFile[];
             }
         ); 

Если вы не укажете тип одиночного запроса перед выполнением форка, интерфейс не будет работать, поэтому вваш сервис, где вы определяете ваш HTTP-запрос Приложения, сопоставьте значение с его интерфейсом:

 .pipe(map((value: Application) => value))

Вам необходимо сопоставить данные с интерфейсом, иначе форк-соединение выдаст ошибку, если вы этого не сделаете,тип по умолчанию будет любым, который будет контрастировать с типом интерфейса, который вы определили в forkJoin.

0 голосов
/ 06 февраля 2019

Базовым типом объектов в JavaScript является функция.
В вашем коде вы пытаетесь присвоить «значение типа» «функции».
Для того, чтобы исправить функцию типа в вашем сервисе .ts , которые возвращают Obserbable, должны возвращать Observable .
ex:

getApplication(): Observable<Application> {}

и после этого в подписаться функция data *Массив 1015 * будет вашего типа без присваивания.

(data) => {
    this.application = data[0];
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...