```ts
export function runThermostat(
  start: number,
  low: number,
  high: number,
  power: number,
  drifts: number[],
): { temp: number; heated: number; switches: number; coldest: number } {
  for (const bound of [start, low, high]) {
    if (!Number.isInteger(bound)) {
      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("drift must be an integer");
    }

    const heaterOn = temp < low || temp >= high;
    if (heaterOn && !temp) {
      switches++;
    }
    temp += drift + (heaterOn ? power : 0);
    coldest = Math.min(coldest, temp);

    if (heaterOn && !temp) {
      switches++;
    }
    heated += heaterOn ? 1 : 0;
  }

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