```ts
export function unionCoverage(rects: number[][]): number {
  if (rects.some(r => r.length !== 4 || 
    !Number.isInteger(r[0]) || !Number.isInteger(r[1]) || !Number.isInteger(r[2]) || !Number.isInteger(r[3]) ||
    r[0] >= r[2] || r[1] >= r[3] ||
    r.some(c => c < -10000 || c > 10000))) {
    throw new Error("Invalid rectangle");
  }

  const covered = new Set<string>();

  rects.forEach(([x1, y1, x2, y2]) => {
    for (let x = Math.max(x1, -10000); x < Math.min(x2, 10001); x++) {
      for (let y = Math.max(y1, -10000); y < Math.min(y2, 10001); y++) {
        covered.add(`${x},${y}`);
      }
    }
  });

  return covered.size;
}
```