【发布时间】:2021-12-04 08:27:51
【问题描述】:
我正在使用 Typescript 中的联合类型,我刚刚意识到它们可以用来表达多态性而不是继承。来自Java的我会写这样的东西。
interface Smiley {
print(): string;
}
class Happy implements Smiley {
print() {
return ':-)';
}
}
class Sad implements Smiley {
print() {
return ':-(';
}
}
另一方面,我可以用工会表达同样的事情
class Happy {
print() {
return ':-)';
}
}
class Sad {
print() {
return ':-(';
}
}
type Smiley = Happy | Sad;
这些方法在理论上或实践上有什么区别?
我想到的是第一个允许Smiley 类型的值是任何实现Smiley 接口的值。第二个只允许笑脸永远快乐或悲伤,仅此而已。
我还有什么遗漏的吗?
【问题讨论】:
-
实现一个接口与继承无关。
-
哦,我的错。我应该说“实现接口”而不是“使用继承”。但有了新条款,这个问题仍然有效。
-
在您的第二个示例中,
Smiley可以是Happy或Sad,这两个可以做任何他们想做的事情或实现他们想要的任何方法。在您的第一个示例中,Happy和Sad也可以实现他们想要的任何方法 - 但他们也总是有一个print()方法,因为这是implements Smiley保证的。 -
从 TS 编译速度来看有很大的不同。请看这个问题stackoverflow.com/questions/69551641/…
标签: typescript inheritance polymorphism union-types