#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 Но может быть проигнорирован для целей этого вопроса.