【发布时间】:2020-12-12 20:45:01
【问题描述】:
在用 Rust 编写了很多代码后,我最近回到了 JS/TS,这是我非常怀念的一个功能。
假设我有一个值,它可能是Cat 的实例或Dog 的实例,并且根据它来自哪个类,我想执行不同的逻辑。由于 Javascript 无法做到classname ==(我认为?),我通常依赖的也是传递一个指示类的字符串,如下所示:
function groomAnimal(animal: Cat | Dog, animalType: 'cat' | 'dog') {
if (animalType === 'cat') {
(animal as Cat).trimNails();
} else {
(animal as Dog).trimFur();
}
}
我讨厌这个,因为它很笨拙,编译器不能保证调用者正确地履行合同。另一方面,在 Rust 中,这将非常优雅:
enum Animal {
Cat(CatData),
Dog(DogData),
}
fn groomAnimal(animal: Animal) {
match animal {
Cat(catData) => catData.trimNails(),
Dog(dogData) => dogData.trimFur(),
}
}
基本上,表示“类”的enum本身也持有“类”数据,因此获取数据和检查数据类型是相同的操作
打字稿中是否有任何模式允许多态函数签名,同时确保在编译时代码对正确的数据类型进行操作?
【问题讨论】:
标签: javascript typescript polymorphism