首页 > 解决方案 > 函数中的 Angular 9 类型检查返回“对象”

问题描述

我有这个方法,我已经绑定到这样的组件输出处理程序:

<app-favorite [favorites]="screenshot.favorites" [userId]="userId" (save)="updateFavorites(screenshot)">
</app-favorite>

这里的问题是屏幕截图实际上可以是 aScreenshot或 a Video,所以我正在尝试进行类型检查来处理它。

在我的方法中,我有这个:

updateFavorites(model: Screenshot | Video): void {
  console.log(model instanceof Screenshot);
  var t = new Screenshot();
  console.log(t instanceof Screenshot);

  /// ****** removed for brevity ****** ///
}

第一个控制台日志输出false,第二个是true。当我添加这些控制台日志时:

console.log(model instanceof Screenshot);
console.log(model.constructor.name);
var t = new Screenshot();
console.log(t instanceof Screenshot);
console.log(t.constructor.name);

它输出:

错误的

目的

真的

截屏

谁能告诉我我做错了什么?

标签: angulartypescript

解决方案


类型断言的一种解决方法是使用类型谓词使用类型保护。尝试以下

private isScreenshot(model: Screenshot | Video): model is Screenshot {
  return (model as Screenshot).<property> !== undefined;
}

您需要将<property>占位符替换为特定于Screenshot该类的属性。然后您可以使用以下命令在运行时断言类型

updateFavorites(model: Screenshot | Video): void {
  if (this.isScreenshot(model)) {
    // do something with object of type `Screenshot`
  } else {
    // do something with object of type `Video`
  }
}

推荐阅读