enum DiffOp { Add = 'ADD', Remove = 'REMOVE', } class DiffNode { op: DiffOp; item: string; constructor(op: DiffOp, item: string) { this.op = op; this.item = item; } } export default function diffStringList( a: Array, b: Array, ): Array { const diff: Array = []; const set = new Set(a); for (const item of b) { if (set.has(item)) { set.delete(item); } else { diff.push(new DiffNode(DiffOp.Add, item)); } } for (const item of set) { diff.push(new DiffNode(DiffOp.Remove, item)); } return diff; }