Отображение между двумя массивами наблюдаемых классов

#angular #dictionary #rxjs #observable

#угловатый #словарь #rxjs #наблюдаемый #angular

Вопрос:

У меня есть два заданных класса SgFormsBase и QuestionBase с немного разными именами членов, и я хочу перевести observable[] из одного в другой.

 import { of, Observable } from 'rxjs'
import { map} from 'rxjs/operators'

class SgFormsBase{
  constructor(
     public id: number,
     public survey: string
  ){}
}

class QuestionBase{
  constructor(
     public qid: number,
     public qsurvey: string
  ){}
}

const a = new SgFormsBase(11, 'Endo')
const b = new SgFormsBase(12, 'Kolo')
const sg = of([a, b] )

function toQuestionsBase(sgforms: Observable<SgFormsBase[]>): Observable<QuestionBase[]> {
  return sgforms.pipe(map(
     sgform =>  new QuestionBase(sgform.id, sgform.survey)))
}

toQuestionsBase(sg)
  

Ответ №1:

Поскольку исходная наблюдаемая является наблюдаемой из SgFormsBase[] , каждое значение, которое она выдает, представляет собой целый массив. Таким образом, наблюдаемый map оператор получает весь массив. Вам нужен другой оператор отображения массива внутри наблюдаемого map оператора.

 function toQuestionsBase(sgforms: Observable<SgFormsBase[]>): Observable<QuestionBase[]> {
  return sgforms.pipe(map(
    sgforms => sgforms.map(sgform => new QuestionBase(sgform.id, sgform.survey))))
}
  

Ответ №2:

параметр sgForms преобразуется в массив SgFormsBase. Итак, что вам нужно сделать, это выдать каждое значение по отдельности, сопоставить отдельные значения с экземплярами QuestionBase, а затем заархивировать их обратно в массив.

 function toQuestionsBase(sgforms: Observable<SgFormsBase[]>): Observable<QuestionBase[]> {
  return sgforms.pipe(
    mergeMap((sgs: SgFormsBase[]) => sgs),
    map((sgForm: SgFormsBase) => new QuestionBase(sgForm.id, sgForm.survey)), 
    toArray());
}
  

Комментарии:

1. Версия @cristian. это работает, и ваш выглядит интересным для меня. Жаль, что это не компилируется из-за Argument of type 'OperatorFunction<SgFormsBase, QuestionBase>' is not assignable to parameter of type 'OperatorFunction<T, QuestionBase>'. Type 'SgFormsBase' is not assignable to type 'T'.

2. Интересно. В последнее время у меня периодически возникали проблемы с компиляцией моих реактивных потоков. Тем не менее, они работают так, как ожидалось. Я опубликовал этот код в одном из своих проектов, и он не показал никакой ошибки компиляции. Вот мои версии: RxJS: версия 6.4.0 Локальный машинописный текст: версия 3.4.1 Глобальный машинописный текст: версия 3.1.1

3. Та же версия для меня. Параметры компиляции: строгий: true, модуль es2015

4. То же самое. Позволяет ли ваш конструктор запускать код? Я не понимаю, почему SgFormsBase не может быть преобразован по типу в универсальный класс T.

5. Да, это ошибка времени выполнения, а не ошибка компиляции. Я просто перестраиваю свой полный node_module с нуля, тот же результат.