Typescript在子类上的模式匹配



假设以下类型层次结构:

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())

游乐场链接

最新更新