```ts
export function carveShift(start: number, end: number, span: number, rest: number, least: number): number[][] {
  if (
    typeof start !== 'number' || typeof end !== 'number' || typeof span !== 'number' || typeof rest !== 'number' || typeof least !== 'number'
    || !Number.isInteger(start) || !Number.isInteger(end) || !Number.isInteger(span) || !Number.isInteger(rest) || !Number.isInteger(least)
    || start >= end || span < 1 || rest < 1 || least < 1 || least > span
  ) {
    throw new Error("Invalid arguments");
  }

  const stretches: number[][] = [];
  let currentStart = start;

  while (currentStart < end) {
    const stretchLength = Math.min(span, end - currentStart);
    if (stretchLength >= least) {
      stretches.push([currentStart, currentStart + stretchLength]);
    }
    currentStart += rest;
  }

  return stretches;
}
```