我们如何使用角内存,网络的API来创建多个集合?不是一个单集的问题。但我没能实现它的多个集合。
例如,我想创建说,在内存数据库两个集合 - 国家和城市。任何想法,该怎么做?
只是两个数组返回一个对象。在从角的例子,你看到这样
createDb() {
let heroes = [ .. ]
return { heroes }
}
如果你还不知道这一点,{ heroes }
只是写{ heroes: heroes }
简写。所以,如果你有两个集合,然后只需将其添加为另一个属性
createDb() {
let heroes = [ .. ];
let crises = [ .. ];
return { heroes, crises };
// or { heroes: heroes, crises: crises }
}
返回的属性的名称将用于在URL路径。所以,你可以使用
/api/heroes/1
/api/crises/1
在Paul's answer描述的方法是正确的,但有一个细节我错过了,我想补充:你如何正确指定genId
,所以它适用于两个集合?
答案是指“英雄”示例写入TypeScript(JavaScript的一个超集),特别是HTTP chapter。在那里,一台heroes
通过实施模拟:
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;
}
}
现在,如果你添加第二个集合crises
如图他的答案,即:
createDb() {
let heroes = [ { ... }, ... ];
let crises = [ { ... }, ... ];
return { heroes, crises };
// or { heroes: heroes, crises: crises }
}
你怎么了两个集合(只要它们类型genId
和Hero
的)提供Crises
?超载,因为你会做它C#
在打字稿不起作用,它会抛出一个错误(“复制功能实现”)。
解决方案:我发现,你可以按如下解决这一问题TypeScript's Generics。通过下面的通用版本替换otiginal genId
功能:
genId<T extends Hero | Crises>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
这里的关键是部分<T extends Hero | Crises>
:这意味着该类型T
可以是Hero
或Crises
:所以,如果传递的参数是任一类型Hero[]
或Crises[]
就会被调用。
有了这些知识,增加了第三,第四,...类很简单:只需追加类。说,我们要添加的类别SuperHero
,那么你只需要通过| SuperHero
追加它,所以它看起来像:
genId<T extends Hero | Crises | SuperHero>(myTable: T[]): number {
return myTable.length > 0 ? Math.max(...myTable.map(t => t.id)) + 1 : 11;
}
注:作为先决条件,所有类(Hero
,Crises
和SuperHero
)需要有一个数字id
财产申报。
相关链接: