```ts
export function mergeIntervals(intervals: number[][]): number[][] {
  if (!Array.isArray(intervals) || intervals.length === 0) {
    throw new Error('Invalid input');
  }

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

  return sortedIntervals.reduce((merged: number[][], current: number[]) => {
    if (merged.length === 0 || merged[merged.length - 1][1] < current[0]) {
      merged.push(current);
    } else if (merged[merged.length - 1][1] <= current[1]) {
      merged[merged.length - 1][1] = current[1];
    }
    return merged;
  }, [] as number[][]).map(([start, end]) => {
    if (start > end) {
      throw new Error('Invalid interval');
    }
    return [start, end];
  });
}
```