typescript - Typescript 中子类的模式匹配

标签 typescript pattern-matching

假设以下类型层次结构:

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 中的子类型上编码/模拟这样的模式匹配?

最佳答案

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

Playground Link

关于typescript - Typescript 中子类的模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70957028/

相关文章:

angular - 在 Angular 2 中将函数从父组件传递到子组件

scala - 我可以使用@switch 和枚举吗?

c - C 中用于将多个正则表达式与单个目标字符串进行匹配的库/算法是什么?

javascript - 在 Typescript 中,Object.prototype 函数可以返回 Sub 类型实例吗?

node.js - 具有相同名称的 typescript 类在不同文件中重复

javascript - VSCode 中的流类型检查性能

string - MYSQL:将 GROUP BY 与字符串文字一起使用

typescript - 是否可以将 typeof 与泛型函数一起使用?

algorithm - 如何计算全名之间的相似度?

c# - C# 中的 ereg_replace 等价物