```ts
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) || !Number.isInteger(power)) {
    throw new Error("Temperature and power must be integers.");
  }
  if (low >= high) {
    throw new Error("Low temperature should be strictly below high.");
  }
  if (!Array.isArray(drifts) || drifts.some(d => typeof d !== 'number')) {
    throw new Error("Drifts must be an array of numbers.");
  }

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

  for (let i = 0; i < drifts.length; i++) {
    const drift = drifts[i];
    if (temp < low) {
      heated++;
      switches++;
      temp += power + drift;
      if (temp < coldest) {
        coldest = temp;
      }
    } else if (temp >= high) {
      heated--;
      switches++;
      temp += drift;
      if (temp < coldest) {
        coldest = temp;
      }
    } else {
      temp += drift;
    }

    // Edge case: no ticks leaves both counts at zero with temp and coldest at start
    if (i === drifts.length - 1 && heated === 0 && switches === 0) {
      return { temp, heated, switches, coldest };
    }
  }

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