我有一个绑定到组件输出处理程序的方法,如下所示:
<app-favorite [favorites]="screenshot.favorites" [userId]="userId" (save)="updateFavorites(screenshot)">
</app-favorite>
这里的问题是屏幕截图实际上可以是Screenshot
或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);
它输出:
错误
目标
真实
屏幕截图
有人能告诉我我做错了什么吗?
类型断言的一个解决方法是使用类型谓词使用类型保护。尝试以下
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`
}
}