```ts
function mergeIntervals(intervals: number[][]): number[][] {
    if (intervals.length === 0) return [];

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

    const merged: number[][] = [];
    let currentStart = intervals[0][0];
    let currentEnd = intervals[0][1];

    for (let i = 1; i < intervals.length; ++i) {
        const [start, end] = intervals[i];
        
        if (end > currentEnd) {
            merged.push([currentStart, currentEnd]);
            currentStart = start;
            currentEnd = end;
        } else if (currentEnd < end) {
            currentEnd = Math.max(currentEnd, end);
        }
    }

    merged.push([currentStart, currentEnd]);
    return merged;
}
```