假设以下类型层次结构:
interface Animal {
//...
}
class Dog implements Animal {
//...
}
class Cat implements Animal {
//...
}
现在,我的代码中有一个变量let l:Array<Animal> = [new Dog(...),new Cat(...)]
Somwhere,我想映射到该数组上,并根据我查看的是Dog
实例还是Cat
实例执行不同的操作,在理想情况下,使用模式匹配等过程。我正在考虑其他函数语言中的模式匹配,如Scala或Haskell:
l.map((a:Animal) => match a {case Cat => ..., case Dog => ... })
有哪些方法可以对TypeScript中的子类型进行编码/模拟这样的模式匹配?
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())
游乐场链接