【问题标题】:How to subtract two readonly array in Typescript如何在 Typescript 中减去两个只读数组
【发布时间】:2019-12-06 04:17:59
【问题描述】:

我们知道我们不能在 Typescript 中连接只读数组,
但是我们可以做到这一点

readonly ArrA = [1, 2, 3] as const;
readonly ArrB = [4, 5] as const;
readonly Arr = [...ArrA, ...ArrB];

加法完成了,那么减法呢?
ps:如果不是readonly,我们可以这样做

ArrA.filter(n => !ArrB.includes(n));

【问题讨论】:

    标签: javascript typescript readonly


    【解决方案1】:

    如果您在tsconfig.json 中将“ES7”添加到compilerOptions.libincludes 将可用(与只读无关)。


    如果您关心数组成员级别的类型安全,您可以执行以下操作:

    const ArrA = [1, 2, 3] as const;
    const ArrB = [3, 4, 5] as const;
    
    // Aliases for tuple-member types
    type ArrAMember = typeof ArrA[number] // (1 | 2 | 3)
    type ArrBMember = typeof ArrB[number] // (3 | 4 | 5)
    
    type ExclusionListMember = Exclude<ArrAMember, ArrBMember> // (1 | 2)
    
    // Type-guard to verify exclusion
    function isExcludedByB(i: ArrAMember): i is ExclusionListMember {
        return !ArrB.includes(i as any)
    }
    
    const ArrC = ArrA.filter(isExcludedByB)
    //    ^ (1 | 2)[]
    

    【讨论】:

      【解决方案2】:

      有很多方法可以做到这一点(减法):

      filter 函数在a1 的元素上运行,并将其(但在一个新数组中)减少为a1 中的元素(因为我们正在迭代它的元素)并且在@ 中丢失987654324@.

      a2 中缺少的 a1 中的元素将不会包含在结果数组中(减法),因为过滤器函数不会迭代 a2 元素:

      readonly a1 = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] as const;
      readonly a2 = ['a', 'b', 'c', 'd'] as const;
      
      let subtraction= a1.filter(item => a2.indexOf(item) < 0);
      console.log(subtraction); // Output --> ["e", "f", "g"]
      

      你也可以使用 lodash 来做到这一点:

      _.difference(['a', 'b', 'c', 'd', 'e', 'f', 'g'],['a', 'b', 'c', 'd']);
      

      希望这能给您一些见解。谢谢。

      【讨论】:

        猜你喜欢
        • 2018-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多