Estoy tratando de obtener 2 selectores con el último concatLatestFrom que se introdujo en NgRx 12, sin embargo, parece que no puedo entender lo que estoy haciendo mal y no puedo lograrlo.
Tengo un efecto que se ve así
loadAllCases$ = createEffect(() => this._actions$.pipe( concatLatestFrom(() => [ this.store.pipe(select(CaseSelectors.getAllCases)), this.store.pipe(select(CaseSelectors.getCasesLoaded)) ]), navigation(this.caseLandingPage, { run: (snap, [loaded, cases]) => { if (loaded) { return CaseActions.loadAllSuccess(); } else { return this._caseService.getAll().pipe( map(cases => CaseActions.loadAllSuccess(cases)) ); } }, onError: (action, error) => { return CaseActions.loadAllFailed(error); } }) ));Sin embargo, esto no parece funcionar debido a la incompatibilidad de tipos.
Argument of type 'OperatorFunction<Action, [Action, boolean, Case[]]>' is not assignable to parameter of type 'OperatorFunction<Action, ActionOrActionWithState<unknown, Action>>'. Type '[Action, boolean, Case[]]' is not assignable to type 'ActionOrActionWithState<unknown, Action>'. Type '[Action, boolean, Case[]]' is not assignable to type '[Action, unknown]'. Source has 3 element(s) but target allows only 2Sin embargo. si solo dejo un selector, esto funciona bien, ¿es este un caso en el que usar concatLatestFrom solo puede seleccionar un selector? Tenga en cuenta que he intentado encadenarlos uno tras otro, esto produce el mismo error. Cualquier ayuda o consejo apreciado.
Este parece ser un error específico de Nx, y la tubería de navegación que proporciona, he abierto un problema relacionado con un error con el Repositorio de Nx https://github.com/nrwl/nx/issues/6830
El código del ejemplo funciona bien si se canaliza con cualquier operación de RxJs.
Hay una declaración de tipo para la función concatLatestFrom y su versión sobrecargada
import { Observable, ObservedValueOf, OperatorFunction } from 'rxjs'; export declare function concatLatestFrom<T extends Observable<unknown>[], V>(observablesFactory: (value: V) => [...T]): OperatorFunction<V, [V, ...{ [i in keyof T]: ObservedValueOf<T[i]>; }]>; export declare function concatLatestFrom<T extends Observable<unknown>, V>(observableFactory: (value: V) => T): OperatorFunction<V, [V, ObservedValueOf<T>]>;https://github.com/ngrx/platform/blob/12.4.0/modules/effects/src/concat_latest_from.ts
Entonces tiene razón, esta función acepta un solo observable o una matriz de observables.
Pero parece que estás usando el orden de los operadores de forma incorrecta.
No estoy seguro de qué significan navegación y caseLandingPage , pero este ejemplo podría darle una idea de cómo arreglar/mejorar su controlador de efectos
public readonly something$ = createEffect( () => this.actions$.pipe( ofType(someAction), concatLatestFrom(() => [ this.store.select(selectFoo), this.store.select(selectBar), ]), switchMap(([action, foo, bar]) => { // Do what you need }), ), );Hmmmm, los tipos aceptan una serie de selectores y también hay una prueba para verificar que funciona.
¿Tienes una reproducción ejecutable? Probablemente el problema sea otro.
El error en sí menciona los tipos correctos devueltos por concatLatestFrom , por lo que supongo que el operador de navigate debe modificarse.
Type '[Action, boolean, Case[]]' is not assignable ...