【问题标题】:Constructor overloading in Typescript with Object.assign使用 Object.assign 在 Typescript 中重载构造函数
【发布时间】:2020-04-11 20:29:21
【问题描述】:

我看到很多关于 Typescript 的构造函数重载技巧的问题。

实际上有什么理由不使用空构造函数然后像这样实例化类吗?

const obj = Object.assign(new MyClass(), {a: 'check', b: 'mate'})

【问题讨论】:

  • 这迫使MyClass 的用户非常了解它的实现。这一点都不好。
  • @Eldar 为什么? MyClass 是类。我们附加属于该类的数据。现在行为被封装到该类型类中
  • 在您的单行代码中,用户必须知道他必须初始化至少 2 个名称为 ab 的字符串属性

标签: typescript oop


【解决方案1】:

这违反了对象负责维护自己的内部状态的原则,并且它将创建MyClass对象的代码与该状态的类表示形式紧密耦合(以哪些属性保存哪些数据的形式)。

您可能希望在构造函数中做的一件常见事情是验证输入;例如,如果矩形的宽度或高度为负数,则抛出错误。您的代码不允许这样做,因为在构造函数返回之前不会分配属性,因此构造函数看不到它们。

您可能想要做的另一件事是添加一些具有预先计算值的额外字段。例如,如果一个类表示具有xyz 坐标的向量,并且您有一个计算长度的length() 方法,您可能需要重构它以便构造函数计算一次长度,存储它在_length 属性中,length() 方法返回该属性。您的代码不允许进行这种重构,因为构造函数将无法看到 xyz 值。

【讨论】:

  • 这不是 mixin 的用途吗? typescriptlang.org/docs/handbook/mixins.html 有数据,然后有可应用于该数据的兼容方法。例如,验证可以是应用于此数据的混合的示例。这就是函数式编程背后的全部理念。
  • 当在构造函数返回之后才分配属性时,如何使用混合允许构造函数验证属性或使用属性预先计算任何内容?
猜你喜欢
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多