```ts
function mergeIntervals(intervals: number[][]): number[][] {
  if (intervals.some(pair => pair[0] > pair[1])) {
    throw new Error('Invalid interval');
  }

  intervals.sort((a, b) => a[0] - b[0]);

  const merged: number[][] = [intervals[0]];
  for (let i = 1; i < intervals.length; i++) {
    const currentInter = intervals[i];
    const lastMerged = merged.pop()!;
    if (currentInter[0] <= lastMerged[1]) {
      merged.push([Math.min(lastMerged[0], currentInter[0]), Math.max(lastMerged[1], currentInter[1])]);
    } else {
      merged.push([...lastMerged, ...currentInter]);
    }
  }

  return merged;
}

// A check function to verify the correctness of the mergeIntervals function
function check() {
  try {
    console.log(mergeIntervals([[1,3],[2,4],[5,7]])); // Expected: [[1,4],[5,7]]
    console.log(mergeIntervals([[1,2], [1,3], [2,4]])); // Expected: [[1,4]]
    console.log(mergeIntervals([[0,1],[0,3],[1,2]])); // Expected: [[0,3]]
    console.log(mergeIntervals([[-1,5],[1,6],[7,8],[9,-2]])); // Expected: [[-1,8],[9,-2]]
  } catch (error) {
    console.error(error);
  }
}

check();
```