在数组元素上使用typescript instanceof guards?

在数组元素上使用typescript instanceof guards?,typescript,Typescript,出于教育目的,我研究了一些非常基本的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].toggleComp

出于教育目的,我研究了一些非常基本的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识别单个数组元素上的保护实例?

看起来这是一个很好的例子。你的解决方法就是我建议的处理方法。谢谢!我搜索了一个问题,但没有找到那个问题。显然我用错了搜索词。