2017-02-07 1 views
3

Я пытаюсь обойти вокруг реактивного программирования и наблюдаемых, конечно же безуспешно. У меня есть следующий код:RxJS уменьшает количество журналов как массива, но ошибка как объект

this.searchSubscription = this.filtersSubject 
    .takeLast(2) 
    .reduce((acc, cur) => { 
    console.log(acc); 
    acc.push(cur); 
    return acc; 
    }, []) 
    .debounceTime(1000) 
    .subscribe(x => this.emitFilters()); 

Я хотел использовать takeLast(2) конвейера к reduce, чтобы я мог превратить его в массив из двух значений, и фильтр определенных значений между двумя были разными. Я просматриваю документы за reduce, даже передавая семя, но VS Code сообщает мне, что Property 'push' does not exist on type 'Object'., но console.log показывает acc как массив. Я озадачен тем, что происходит, и как это исправить. И, конечно, я могу решить эту проблему совершенно неправильно, что делает наблюдаемые достаточно трудными для понимания.

ответ

5

Ваш код верный, но в rxjs5 есть ошибка, которая препятствует проверке типа.

Глядя на исходном коде снижение мы видим следующую подпись

export function reduce<T>(this: Observable<T>, accumulator: (acc: T, value: T, index: number) => T, seed?: T): Observable<T>; 

export function reduce<T>(this: Observable<T>, accumulator: (acc: T[], value: T, index: number) => T[], seed?: T[]): Observable<T[]>; 

export function reduce<T, R>(this: Observable<T>, accumulator: (acc: R, value: T, index: number) => R, seed?: R): Observable<R>; 

При написании перегрузок в машинописном необходимо заказать их от большого до наималейшей специфичности в отношении их типов, включая их аргументы типа. Это связано с тем, что TypeScript выбирает первую соответствующую перегрузку. В этом случае последнее объявление в наборе перегрузки должно быть указано как первое.

Я создал https://github.com/ReactiveX/rxjs/issues/2339 по причине этот вопрос.

+0

Спасибо за отзыв. У меня достаточно проблем, обертывая голову вокруг реактивного программирования, что-то вроде того, что заставляет меня думать, что я ошибаюсь ... Который я, вероятно, все еще есть. Знаете ли вы, могу ли я обойти это или сделать что-то еще в разное время? – RhoVisions

+1

Кроме того, вы могли бы избежать ошибки и могли бы упростить свой код с помощью оператора '' toArray' '(http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#instance-method-toArray). (И, поскольку наблюдаемое завершается, 'debounceTime' является избыточным и просто служит задержкой, так как он будет видеть когда-либо только одно значение - массив.) – cartant

+0

Не прибегая к редактированию источника, есть несколько работ, но они довольно сложно. Это довольно серьезная ошибка, которая должна быть исправлена. Я удивлен, что она не сообщалась ранее. Возможно, это так. –