【问题标题】:DRY - Typescript. How can I use DRY principles to avoid duplication of these 2 getters干 - 打字稿。我如何使用 DRY 原则来避免这两个 getter 的重复
【发布时间】:2020-04-16 07:09:47
【问题描述】:

我知道下面两个 getter 是重复的,可以合并并以更好的方式编写。谁能帮我想出一种方法来巩固这些:-

isEqual 这里是一个比较两个对象的 lodash 库。 这里的状态是一个注入状态,我从中挑选对象。

   public get isUpperModified(): boolean {
        if (!this.isUpperAvailable) {
          return false;
        }
        if (
          (this.orders.upperPreference.type === '1' &&
            this.state.fetchedData.upperPreference.type === '1') ||
          (this.orders.upperPreference.type === 'UPPER' &&
            this.state.fetchedData.upperPreference.type === 'UPPER')
        ) {
          return false;
        }
        if (!isEqual(this.orders.upperPreference, this.state.fetchedData.upperPreference)) {
          return true;
        }
        return false;
      }




public get isLowerModified(): boolean {
        if (!this.isLowerAvailable) {
          return false;
        }
        if (
          (this.orders.lowerPreference.type === '1' &&
            this.state.fetchedData.lowerPreference.type === '1') ||
          (this.orders.lowerPreference.type === 'LOWER' &&
            this.state.fetchedData.lowerPreference.type === 'LOWER')
        ) {
          return false;
        }
        if (!isEqual(this.orders.lowerPreference, this.state.fetchedData.lowerPreference)) {
          return true;
        }
        return false;
      }

【问题讨论】:

  • 能否请您也显示对这些方法的调用?

标签: javascript typescript dry getter typescript2.0


【解决方案1】:

实现这一目标的方法不止一种。

您可以创建一个新函数isModified(type: string) 并将upperlower 作为参数传递。

希望对你有帮助

public get isUpperModified(): boolean {
    return this.isModified('upper');
}


public get isLowerModified(): boolean {
    return this.isModified('lower');
}

private isModified(type: 'lower' | 'upper'): boolean {

    const available = type === 'lower' ? this.isLowerAvailable : this.isUpperAvailable;
    const order = type === 'lower' ? this.orders.lowerPreference : this.orders.upperPreference;
    const state = type === 'lower' ? this.state.fetchedData.lowerPreference : this.state.fetchedData.upperPreference;

    if (!available) {
       return false;
    }

    if (
        (order.type === '1' &&
            state.type === '1') ||
        (order.type === type.toUpperCase() &&
            state.type === type.toUpperCase())
    ) {
        return false;
    }
    if (!isEqual(order, state)) {
        return true;
    }
    return false;
}

【讨论】:

  • 感谢您的回复。您的意思是“私人修改”而不是私人“获取”修改。因为 getter 不能接受参数。
  • 啊抱歉 :) 不应该有get
【解决方案2】:

我会这样做

public get isModified(type: 'lower' | 'upper'): boolean {
        const isAvailable = type === "lower" ? this.isLowerAvailable : this.isUpperAvailable
        const preference = type === "lower" ? "lowerPreference" : "upperPreference";
        if (!isAvailable) {
          return false;
        }
        if (
          (this.orders[preference].type === '1' &&
            this.state.fetchedData[preference].type === '1') ||
          (this.orders[preference].type === 'LOWER' &&
            this.state.fetchedData[preference].type === 'LOWER')
        ) {
          return false;
        }
        if (!isEqual(this.orders[preference], this.state.fetchedData[preference])) {
          return true;
        }
        return false;
      }

然后在调用这个方法时

使用isModified("upper") 而不是isUpperModified

使用isModified("lower") 而不是isLowerModified

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2022-01-23
    • 1970-01-01
    • 2014-05-15
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多