Преобразование карты rxjs 5 в карту rxjs 6

Рассмотрим следующий код Angular 5 + более старые rxjs

this.measurementUnitsService.GetAll().subscribe(
        res => {
            this.measurementUnits = res.map(x => new MeasurementUnit(x));
        }
    )

Я получаю список объектов и для каждого из них создаю новый строго типизированный класс.

Как бы я сделал то же самое в angular 6 + rxjs 6 Моя попытка.

this.measurementUnitsService.GetAll().pipe<MeasurementUnit[]>(mergeMap(x => new MeasurementUnit(x))).subscribe(
  res => {
    this.measurementUnits = res;
  }
)

К сожалению, это вызывает ошибку Type 'MeasurementUnit[]' has no properties in common with type 'Partial<MeasurementUnit>'.

MeasurementUnit на всякий случай

export class MeasurementUnit {
Id: number;
CreatedDate: Date;
ModifiedDate: Date;
Disabled: boolean;
DisabledDate: Date;
Name: string;
Description: string;

ParentId: number;

public constructor(item: Partial<MeasurementUnit>) {
    //item.EstablishedDate = new DatePipe('en-US').transform(item.EstablishedDate, "yyyy-MM-dd");

    Object.assign(this, item);
}
}

person americanslon    schedule 14.08.2018    source источник
comment
вы используете mergeMap вместо map. это намеренно?   -  person Niladri    schedule 14.08.2018
comment
Если я правильно понимаю, вам вообще ничего не нужно менять - вы просто отображаете массив, а не наблюдаемое, и RxJS 6 не имеет к этому никакого отношения.   -  person John Montgomery    schedule 14.08.2018
comment
@Niladri либо один из них выдает ту же ошибку. Когда я пробовал разные варианты, map, похоже, вызывал худшую ошибку, поэтому я изменил ее на mergeMap. Теперь они оба делают одну и ту же ошибку.   -  person americanslon    schedule 14.08.2018
comment
Какой тип this.measurementUnits? это Partial<MeasurementUnit>   -  person Niladri    schedule 14.08.2018
comment
@JohnMontgomery ах, в этом есть смысл. Я как бы новичок во всей наблюдаемой схеме, и я думал, что карта всегда имеет какое-то отношение к rxjs.   -  person americanslon    schedule 14.08.2018
comment
@Niladri MeasurementUnit[]   -  person americanslon    schedule 14.08.2018
comment
@americanslon, вы можете опубликовать код, в котором объявлено this.measurementUnits   -  person Niladri    schedule 14.08.2018


Ответы (1)


У вас Observable<MeasurementUnit[]>, а не Observable<MeasurementUnit>.

Это означает, что когда наблюдаемый испускает значение, это будет массив, а не одно значение. Следовательно, вам нужна обычная array карта, а не Observable.

Просто сделать:

this.measurementUnitsService.GetAll()
  .pipe(
    map(array => array.map(x => new MeasurementUnit(x)))
  ).subscribe(res => this.measurementUnits = res);
person Kim Kern    schedule 14.08.2018
comment
Имеет смысл. Это действительно похоже на то, что есть у меня. Приносит ли это какие-либо преимущества по сравнению с исходным решением (которое работает), например, встряхиванием деревьев и всем прочим, в чем операторы конвейерной передачи должны быть лучше? - person americanslon; 14.08.2018
comment
Нет, особой разницы нет. Это просто более функциональный способ, и делать что-то в subscribe необходимо. Если позже вы захотите добавить дополнительные преобразования к оператору pipe() или захотите использовать канал async Angular в своем шаблоне вместо того, чтобы обрабатывать подписку вручную, то этот способ будет полезен. - person Kim Kern; 14.08.2018
comment
@americanslon в исходном коде используется оператор карты rxjs для преобразования каждого излучаемого значения Observable, но внутри карты вам нужно использовать Array.map из javascript для преобразования каждого излучаемых значений массива Observable, если вы ожидаете Observable<MeasurementUnit[]> из метода measureUnitsService.GetAll (). - person Niladri; 14.08.2018
comment
@KimKern, ваш код работает, но я получаю ошибку intellisense на array.map. Property map doesn't exists on the type {}. кажется, думает array это {}. На самом деле у меня эта проблема возникает везде, где я использую операторы конвейера - все они думают, что значение, которое они получают, имеет тип {}. У меня есть целая ветка об этом, если вы хотите взглянуть. stackoverflow.com/questions/51845336 / - person americanslon; 14.08.2018
comment
Можете ли вы добавить Observable<MeasurementUnit[]> в качестве типа возврата к GetAll в MeasurementUnitsService? - person Kim Kern; 14.08.2018
comment
Я тоже пробовал с этим. То же самое. Я думаю, что это что-то еще, начиная с 1. В приведенном выше коде, если вы наводите курсор на .GetAll(), возвращаемый тип правильно выводится как Observable<MeasurementUnit[]> 2. У меня есть эта проблема везде, где я использую конвейерные операторы, даже когда имею дело с простыми типами или наблюдаемыми, которые я не контролирую ( и поэтому не может установить возвращаемый тип). - person americanslon; 14.08.2018