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

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

    const merged: number[][] = [];
    let current: number[] | null = null;

    for (const interval of intervals) {
        if (!current || current[1] < interval[0]) {
            if (current) merged.push(current);
            current = interval;
        } else {
            current[1] = Math.max(current[1], interval[1]);
        }
    }

    return merged.concat(current ? [current] : []);
}
```