```typescript
export function carveShift(start: number, end: number, span: number, rest: number, least: number): number[][] {
    if (!Number.isInteger(start) || !Number.isInteger(end) || !Number.isInteger(span) || !Number.isInteger(rest) || !Number.isInteger(least)) {
        throw new Error("All arguments must be whole numbers.");
    }
    if (start >= end) {
        throw new Error("Start must precede end.");
    }
    if (span < 1 || rest < 1 || least < 1 || least > span) {
        throw new Error("Span, rest, and least must be between 1 and span inclusive.");
    }

    const shifts = [];
    let current = start;
    while (current + least <= end) {
        if (end - current >= span) {
            shifts.push([current, current + span]);
            current += span + rest;
        } else {
            breaks the loop as the remaining shift is less than the least required stretch
            break;
        }
    }

    return shifts;
}
```