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

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

  return sortedIntervals.reduce((merged, current) => {
    const lastMerged = merged.length ? merged[merged.length - 1] : null;

    if (!lastMerged || current[0] > lastMerged[1]) {
      merged.push(current);
    } else {
      merged[merged.length - 1][1] = Math.max(lastMerged[1], current[1]);
    }

    return merged;
  }, [] as number[][]);
}
```