干 - 打字稿。我如何使用 DRY 原则来避免这两个吸气剂的重复

DRY - Typescript. How can I use DRY principles to avoid duplication of these 2 getters

我知道下面两个 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;
      }

实现此目的的方法不止一种。

您可以创建一个新函数 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;
}

我会这样做

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