```ts
function tierCost(units: number, allowance: number, firstRate: number, laterRate: number): number {
    if (units < 0) {
        throw new Error("Number of units must be non-negative.");
    }
    if (allowance < 0) {
        allowance = 0;
    }
    if (firstRate === laterRate) {
        throw new Error("First rate must be different from later rate.");
    }
    if (firstRate === 0) {
        return allowance * units;
    }
    if (laterRate === 0) {
        return allowance * units;
    }
    return allowance * units + (firstRate * (units - 1)) / 2;
}
```