我正在尝试(1)别名返回对象的属性名称+ (2)定义其类型。
到目前为止,对属性名称进行别名化很容易,但是我找不到定义其类型的方法。
注意::我知道我可以像这样(<Car>car).id
那样将其强制转换为函数体,但是我想知道是否可以在参数声明中对其进行定义。
注意: dropModel
不是我的功能,它是导入包的功能。
这是我遇到的一个简单的StackBlitz demo问题。查看第33行的app.component.ts
文件,看看我的项目是any
。如何将其定义为Vemp
类?
我的代码:
this.myService.dropModel('cars').subscribe(({ target: team, item: car }) => {
const targetTeamId = team.id;
const droppedCarId = car.id;
})
如您所见,我将target
属性的别名为team
,并将item
的别名为car
,现在我可以在代码中使用它们了,这更好了解它。
此代码类型不安全,team
和car
为any
的问题。
dropModel函数声明:
dropModel: (groupName?: string) => Observable<{
target: any;
item: any;
}>;
答案 0 :(得分:1)
您可以指定别名对象的类型,例如:
dropModel('cars').subscribe(({
target: team,
item: car
}: {
target: Team,
item: Car
}) => {
const targetTeamId = team.id;
const droppedCarId = car.id;
});
但是,声明结果类型会更方便:
interface TargetItem<TTarget, TItem> {
target: TTarget,
item: TItem
}
const dropModel: (groupName?: string) => Observable<TargetItem<any, any>> = ...
dropModel('cars').subscribe(({ target: team, item: car }: TargetItem<Team, Car>) => {
const targetTeamId = team.id;
const droppedCarId = car.id;
});
或改为使用通用函数:
const dropModel: <TTarget, TItem>(groupName?: string) => Observable<{
target: TTarget;
item: TItem;
}> = ...;
dropModel<Team, Car>('cars').subscribe(({target: team, item: car}) => {
const targetTeamId = team.id;
const droppedCarId = car.id;
})