Angular2: получить канал, который выбирает из массива `|` один объект

#angular #typescript #rxjs6 #akita

#angular #typescript #rxjs6 #akita

Вопрос:

У меня есть немного сложная наблюдаемая в Angular (благодаря использованию Akita, я не могу это изменить), это | ‘ed наблюдаемая либо для массива Dinosaur объектов, либодля одного Dinosaur объекта, либо для неопределенного:

 import { QueryEntity } from "@datorama/akita";

export class DinosaurQuery extends QueryEntity<DinosaurState, Dinosaur> {
  activeDinosaurs$ = this.selectActive(); // Type: Observable<Dinosaur[]> | Observable<Dinosaur | undefined>

  constructor(protected store: DinosaursStore) {
    super(store);
  }
}
  

То, что я хочу получить от этого в качестве наблюдаемого, — это либо один объект, либо первый объект в массиве, если это массив. Или не определено, если такового нет.

 export class DinosaurSelection {
    // I want singleSelectedDinosaur$ to be of type: Observable<Dinosaur | undefined>
    singleSelectedDinosaur$ = this.dinosaurQuery.activeDinosaurs$.pipe(???);

    constructor(protected dinosaurQuery: DinosaurQuery) {}

}
  

Я предполагаю, что должен быть какой-то канал, который делает это, но я не могу найти что-то подходящее, что может воздействовать на | объекта и массива этого объекта одновременно. (Или, может быть, это невозможно сделать с помощью канала, но по-другому, это тоже нормально.)

Ответ №1:

просто используйте «канал (карта)» для преобразования, если это массив

 singleSelectedDinosaur$ = this.dinosaurQuery.activeDinosaurs$.pipe(
    map((res:any)=>{
       if (res amp;amp; Array.isArray(res)) //if res and is array
          return res[0]   //return the first element
       return res;      //else resut res
    }
));
  

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

1. Спасибо, это действительно то, что я ищу, но это выдает мне ошибку: error TS2554: Expected 0 arguments, but got 1. Есть идеи, почему это может быть?

2. Я не вижу, где ошибка, попробуйте (res:any|any[])

3. По-прежнему выдает ту же ошибку… но, как ни странно, он действительно работает правильно, поэтому может быть какая-то настройка уровня ошибок компилятора — я пометил ответ как принятый. Может быть, мне не хватает какого-то импорта, чтобы это работало правильно? У меня есть: import { isArray } from "util"; import { map } from "rxjs/operators";

4. isArray — это JavaScript: developer.mozilla.org/es/docs/Web/JavaScript/Referencia /… итак, вам не нужно ничего импортировать, «map» — это оператор ‘rxjs /operators’, поэтому вы должны импортировать map из ‘rxjs / operators’

5. Оставшаяся ошибка оказалась не связанной с этим билетом. Для полноты картины это было результатом проблемы, описанной здесь: github.com/datorama/akita/issues/184 Но может быть проигнорирован для целей этого вопроса.