L'approche décrite dans le La réponse de Paul est correct, mais il y a un détail qui m'a échappé et que j'aimerais ajouter : Comment spécifier genId
correctement, afin que cela fonctionne pour les deux collections ?
La réponse se réfère à l'exemple "Heroes" écrit en TypeScript (un sur-ensemble de JavaScript), et plus particulièrement la fonction Chapitre HTTP . Là, une table heroes
est simulée par la mise en œuvre :
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;
}
}
Maintenant, si vous ajoutez un 2ème collection crises
comme indiqué dans sa réponse, c'est-à-dire :
createDb() {
let heroes = [ { ... }, ... ];
let crises = [ { ... }, ... ];
return { heroes, crises };
// or { heroes: heroes, crises: crises }
}
comment fournissez-vous genId
pour les deux collections (à condition qu'elles soient de type Hero
y Crises
) ? La surcharge, comme vous le feriez en C#
ne fonctionne pas en TypeScript, car elle déclencherait une erreur ("Duplicate function implementation").
Solution : J'ai découvert que vous pouvez résoudre ce problème avec Les génériques de TypeScript comme suit. Remplacer l'otiginal genId
par la version générique suivante :
genId<T extends Hero | Crises>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
Ce qui est important ici, c'est la partie <T extends Hero | Crises>
: Cela signifie que le type T
peut être soit Hero
o Crises
: Il sera donc invoqué si le paramètre passé est soit de type Hero[]
o Crises[]
.
Avec cette connaissance, L'ajout d'une 3ème, 4ème, ... classe est simple : Il suffit d'ajouter la classe. Disons que nous voulons ajouter la classe SuperHero
alors vous l'ajoutez simplement via | SuperHero
Ainsi, cela ressemblerait à :
genId<T extends Hero | Crises | SuperHero>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
Nota: Comme condition préalable, tous les cours ( Hero
, Crises
y SuperHero
) doivent avoir une valeur numérique id
propriété déclarée.
Liens utiles :