网站搜索

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

游乐场链接