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())
假定以下类型层次结构:
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())