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

时间:2019-10-23 00:51:31

标签: 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].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实例?

0 个答案:

没有答案