别名对象的属性名称+定义其类型

时间:2019-08-07 19:14:53

标签: typescript

我正在尝试(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,现在我可以在代码中使用它们了,这更好了解它。

此代码类型不安全,teamcarany的问题。


dropModel函数声明:

dropModel: (groupName?: string) => Observable<{
  target: any;
  item: any;
}>;

1 个答案:

答案 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;
})