在 Typescript 中对子类进行模式匹配
假设以下类型层次结构:
interface Animal {
//...
}
class Dog implements Animal {
//...
}
class Cat implements Animal {
//...
}
现在,我在代码中的某处有一个变量 let l:Array<Animal>=[new Dog(...),new Cat(...)],我想遍历该数组,并根据我查看的是 Dog 实例还是 Cat 实例执行不同的操作,在理想情况下使用类似模式匹配的过程。我想的是其他函数式语言中的模式匹配,比如 Scala 或 Haskell:
l.map((a:Animal) => match a {case Cat => ..., case Dog => ... })
在 TypeScript 中,有哪些方法可以对子类型进行像这样的模式匹配或模拟?
答案#1
JavaScript 中没有模式匹配语法,因此 TypeScript 中也没有这样的语法(因为那将是运行时语法,而 TypeScript 不再添加这些,它依赖于对 JavaScript 的扩展)
你可以使用类型保护。如果你正在处理类,最好的类型保护是 instanceof。
let l = [new Cat(), new Dog()];
l.map((a:Animal) =>
a instanceof Dog ? a.isGoodBoy() :
a instanceof Cat ? a.sayName():
a.speak())
游乐场链接
