如何在打字稿中减去两个只读数组

How to subtract two readonly array in Typescript

我们知道我们不能在 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));

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

filter 函数遍历 a1 的元素并将它(但在一个新数组中)缩减为 a1 中的元素(因为我们正在迭代它是元素)并且在 a2.

中缺失

a2a1 中缺失的元素将不会包含在结果数组(减法)中,因为过滤函数不会迭代 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']);

希望这能给您一些启发。谢谢。

如果您将 "ES7" 添加到 tsconfig.json 中的 compilerOptions.lib

includes 将可用(无论是否只读)。


如果你关心数组成员级别的类型安全,你可以这样做:

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)[]