Tengo un problema en el que recibo un mensaje de error sobre el valor de retorno de una función tachada, que se burla del retorno de un Observable (usando rxjs-marbles ).
El problema que tengo es que el mensaje de error parece indicar que una propiedad de un objeto no existe en el tipo de devolución.
Desde el archivo de prueba de la unidad
it('', marbles((m) => { stub(ambulatoryListDataManager, 'combinedMultipleSearchStatuses').returns( m.cold('a', [ { searchStatus: SearchStatus.active, // SearchStatus is an enum type flags: { loaded: true, loading: false }, list: recordList, }, {...}, ]), ); });Recibo el siguiente tipo de error:
Type '{ searchStatus: SearchStatus.active; flags: { loaded: true; loading: false; }; list: IRecord[]; }' is not assignable to type '{ searchStatus: SearchStatus; flags: ListFlagsSelection; list: IRecord[]; }[]'. Object literal may only specify known properties, and 'searchStatus' does not exist in type '{ searchStatus: SearchStatus; flags: ListFlagsSelection; list: IRecord[]; }[]' context.d.ts(11, 9): The expected type comes from this index signature Como puede ver, la misma propiedad searchStatus , que afirma que no existe en el Object literal , está justo ahí en la definición de tipo que se muestra en el mensaje de error. No parece quejarse de las otras propiedades.
Tenga en cuenta que SearchStatus es un tipo de enumeración .
Todo parece estar completamente bien para mí, entonces, ¿por qué recibo este error?
Esta es una escritura inferida, por lo que pensé que tal vez ayudaría a hacer explícito el retorno de la función, pero no ayuda, sigo teniendo el mismo problema.
Para más contexto, si es necesario, aquí está la función, y la función en sí misma se basa. La primera función es la que proporciona los detalles que usa TypeScript para inferir el retorno esperado.
public combinedSearchStatuses(searchStatus: SearchStatus) { return combineLatest(...).pipe( map(([flags, list]) => ({ searchStatus, flags, list })), ); } public combinedMultipleSearchStatuses(searchStatuses: SearchStatus[]) { return combineLatest(searchStatuses.map( (searchStatus) => this.combinedSearchStatuses(searchStatus)), ).pipe(distinctUntilChanged((a, b) => {...})El error es ligeramente engañoso y difícil de detectar, se queja de que searchStatus no existe en el tipo de matriz , lo cual es cierto.
Esta línea en concreto,
Type '{ searchStatus: SearchStatus.active; flags: { loaded: true; loading: false; }; list: IRecord[]; }' is not assignable to type '{ searchStatus: SearchStatus; flags: ListFlagsSelection; list: IRecord[]; }[]'.Aquí hay un patio de juegos de TS para mostrar aún más por qué
Creo que necesita devolver una matriz de observables en lugar de una observable con una matriz de objetos.
Algo como [m.cold('a', { ... }, m.cold('a', {...})]
Después de la respuesta de Antonio sobre la necesidad de devolver una matriz de Observables, me di cuenta de que había pasado por alto un paso en la definición de la canica rxjs. Necesito definir el paso de retorno para a
Así es como debería verse:
stub(ambulatoryListDataManager, 'combinedMultipleSearchStatuses').returns( m.cold('-a', { a: [ { searchStatus: SearchStatus.active, flags: { loaded: true, loading: false }, list: recordList, }, { searchStatus: SearchStatus.active, flags: { loaded: true, loading: false }, list: recordList, }, ],Como olvidé definir correctamente el objeto, se quejaba de que no se definía correctamente el retorno.