cannot - MĂșltiples colecciones en Angular-in-memory-web-api
cannot find module angular in memory web api (2)
¿Cómo creamos múltiples colecciones utilizando Angular-in-memory-web-api? No es un problema con una sola colección. Pero no se puede implementar para múltiples colecciones.
Por ejemplo. Quiero crear, por ejemplo, dos colecciones en la memoria db - País y ciudades ¿Alguna idea?
El enfoque descrito en la respuesta de Paul es correcto, sin embargo, hay un detalle que omití y me gusta agregar: ¿Cómo se especifica el genId
correctamente, por lo que funciona para ambas colecciones?
La respuesta se refiere al ejemplo de "Héroes" escrito en TypeScript (un superconjunto de JavaScript), específicamente el capítulo HTTP . Allí se simula una mesa de heroes
implementando:
export class InMemoryDataService implements InMemoryDbService {
createDb() {
const heroes = [
{ id: 11, name: ''Mr. Nice'' },
{ id: 12, name: ''Narco'' },
// ...
{ id: 20, name: ''Tornado'' }
];
return {heroes};
}
// Overrides the genId method to ensure that a hero always has an id.
// If the heroes array is empty,
// the method below returns the initial number (11).
// if the heroes array is not empty, the method below returns the highest
// hero id + 1.
genId(heroes: Hero[]): number {
return heroes.length > 0 ? Math.max(...heroes.map(hero => hero.id)) + 1 : 11;
}
}
Ahora, si agrega una segunda crises
colección como se muestra, ¿cómo proporciona el genId
para ambas colecciones? La sobrecarga, como lo haría en C#
no funciona en TypeScript, arrojaría un error ("Implementación de función duplicada").
Solución: Descubrí que puede resolver este problema con Genéricos de la siguiente manera. Reemplace la función genid genId
por la siguiente versión genérica:
genId<T extends Hero | Crises>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
Lo importante aquí es la parte <T extends Hero | Crises>
<T extends Hero | Crises>
: significa que el tipo T
puede ser Hero
o Crises
: Por lo tanto, se invocará si el parámetro pasado es de tipo Hero[]'' or
Crisis [] `.
Nota: como requisito previo, ambas clases ( Hero
y Crises
) deben tener una propiedad de id
numérica declarada.
Enlaces útiles:
¿Puede especificar múltiples restricciones de tipo para los genéricos de TypeScript?
Solo devuélvalo un objeto con ambas matrices. En el ejemplo de Angular, ves algo como
createDb() {
let heroes = [ .. ]
return { heroes }
}
Si aún no lo sabes, { heroes }
es solo una abreviatura para escribir { heroes: heroes }
. Entonces, si tiene dos colecciones, solo agréguelas como otra propiedad.
createDb() {
let heroes = [ .. ];
let crises = [ .. ];
return { heroes, crises };
// or { heroes: heroes, crises: crises }
}
El nombre de la propiedad devuelta se utilizará para la ruta en la URL. Así que puedes usar
/api/heroes/1
/api/crises/1