【问题标题】:What is the difference between inheritance and union types to express polymorphism?继承和联合类型表达多态性有什么区别?
【发布时间】: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 可以是HappySad,这两个可以做任何他们想做的事情或实现他们想要的任何方法。在您的第一个示例中,HappySad 也可以实现他们想要的任何方法 - 但他们也总是有一个 print() 方法,因为这是 implements Smiley 保证的。
  • 从 TS 编译速度来看有很大的不同。请看这个问题stackoverflow.com/questions/69551641/…

标签: typescript inheritance polymorphism union-types


【解决方案1】:

对于这些特定属性,没有太大区别。 Smiley 的行为类似于 { print: () => string } 类型。两个版本都不会强迫它,因此 Happy 和 Sad 是唯一匹配类型的东西;总有人可以用一个返回字符串的打印函数编写一个新对象,它会匹配Smiley

但是,一旦您开始添加更多属性,它们的行为就会不同。如果您向两个类添加一个公共属性,则示例 2 将自动将该属性包含在 Smiley 中。但在示例 1 中,Smiley 只有在将其添加到 Smiley 时才会获得额外的属性,而不是在将其添加到 Happy/Sad 时。

或者更重要的是,它们具有一些不同的属性。这就是工会最有用的地方。可以访问在类型之间共享的任何属性而不会抱怨打字稿,但是除非您进行适当的检查以缩小类型范围,否则无法访问唯一的属性。

class Happy {
  print() {
    return ':-)';
  }
  greet() {
    return 'hi';
  }
}

class Sad {
  print() {
    return ':-(';
  }
  exterminate() {
    return 'bye';
  }
}

type Smiley = Happy | Sad;

const example: Smiley = /* some object; maybe it's a Happy, maybe it's a Sad, maybe something else matching Smiley*/

example.print(); // Allowed by typescript
if ('greet' in example) {
  example.greet(); // Allowed, because we have narrowed it down to a Happy
}
example.exterminate(); // Not allowed, because I have no code to confirm it's a Sad

【讨论】:

    猜你喜欢
    • 2015-01-19
    • 2022-09-27
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2016-08-16
    • 2010-10-24
    相关资源
    最近更新 更多