#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 с нуля, тот же результат.