```typescript
export function runThermostat(
  start: number,
  low: number,
  high: number,
  power: number,
  drifts: number[],
): { temp: number; heated: number; switches: number; coldest: number } {
  if (!Number.isInteger(start) || !Number.isInteger(low) || !Number.isInteger(high)) {
    throw new Error("temperatures must be integers");
  }
  if (low >= high) {
    throw new Error("low must lie strictly below high");
  }
  if (!Number.isInteger(power) || power <= 0) {
    throw new Error("power must be a positive integer");
  }
  if (!Array.isArray(drifts)) {
    throw new Error("drifts must be a list");
  }

  let temp = start;
  let heated = 0;
  let switches = 0;
  let coldest = start;

  for (const drift of drifts) {
    if (!Number.isInteger(drift)) {
      throw new Error("drifts must consist only of integers");
    }

    // Determine the heater state
    const isHeating = temp < low || temp >= high;

    // Apply heating effect based on heater state
    if (isHeating) {
      temp += power;
      heated++;
    } else {
      temp += drift;
    }

    // Track coldest temperature
    if (temp < coldest) {
      coldest = temp;
    }

    // Count switch states
    if ((temp >= low && temp < high) !== isHeating) {
      switches++;
    }
  }

  return { temp, heated, switches, coldest };
}
```