Typescript 中子类的模式匹配

Pattern matching in Typescript over subclasses

假定以下类型层次结构:

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 => ... })

有哪些方法可以 code/emulate 在 TypeScript 中对子类型进行这样的模式匹配?

JavaScript 中没有模式匹配语法,所以 TypeScript 中也没有这样的语法(因为那将是运行时语法,TypeScript 不再添加它,它依赖于对 [=19= 的补充) ])

你可以使用类型保护。如果你正在处理 类,最好使用的类型保护是 instanceof.


let l = [new Cat(), new Dog()];
l.map((a:Animal) => 
    a instanceof Dog ? a.isGoodBoy() :
    a instanceof Cat ? a.sayName(): 
    a.speak())

Playground Link