在研究一些非常基本的Typescript示例以进行教学时,我想到了一个名为Note
的超类和一个名为Todo
的子类。 Todo
类包含toggleComplete()
类所缺少的Note
方法。然后,我使用以下代码创建一个故意错误:
let notes:Note[] = [];
notes[0] = new Note("Note content");
notes[1] = new Todo("Todo content");
console.log(notes[1].toggleComplete()); // error. Note objects do not contain toggleComplete()
这一切都很好,我的学生知道为什么它不起作用。然后,我尝试向他们展示如何使用instanceof Guard解决该问题,并尝试了以下方法:
if (notes[1] instanceof Todo) {
notes[1].toggleComplete(); // Same error! Why?
}
如果我先将notes[1]
分配给另一个变量,则可以正常工作:
let n = notes[1];
if (n instanceof Todo) {
console.log(n.toggleComplete();) //no error, as expected
}
但是,这似乎是不必要的解决方法,并且不能很好地扩展到基于索引的传统for
循环(是的,我知道我可以使用for of
循环,但是我避免了现在出于超出此帖子范围的原因)。有没有办法让Typescript识别单个数组元素上的guard实例?