```ts
type Interval = [number, number];

function isOverlapping(interval: Interval): boolean {
  const [start1, end1] = interval;
  return !((start2 < end1 && end2 - start1 > 0) || (end1 < start2 && end1 - start2 > 0));
}

export function mergeIntervals(intervals: Interval[]): Interval[] {
  // Sort by start
  intervals.sort(([start1], [start2]) => start1 - start2);

  const merged: Interval[] = [];
  for (const interval of intervals) {
    if (merged.length === 0 || !isOverlapping(merged[merged.length - 1], interval)) {
      merged.push(interval);
    } else {
      const [prevStart, prevEnd] = merged.pop()!;
      merged.push([Math.min(prevStart, interval[0]), Math.max(prevEnd, interval[1])]);
    }
  }

  return merged;
}
```