```typescript
export function maskFromPrefix(prefix: number): string {
  if (!Number.isInteger(prefix) || prefix < 0 || prefix > 32) {
    throw new Error("prefix must be an integer between 0 and 32");
  }
  let mask = "255.255.255.255";
  for (let i = 31; i >= prefix; i--) {
    mask = mask.replace(/255/g, "0");
  }
  return mask;
}

export function prefixFromMask(mask: string): number {
  if (typeof mask !== "string") {
    throw new Error("mask must be a string");
  }

  const octets = mask.split(".");
  if (octets.length !== 4) {
    throw new Error("mask must contain exactly four dot-separated fields");
  }

  let prefix = 0;
  for (let i = 0; i < 4; i++) {
    const octet = parseInt(octets[i], 10);
    if (isNaN(octet) || octet < 0 || octet > 255) {
      throw new Error("mask field must be a decimal digit between 0 and 255");
    }
    for (let j = 7; j >= 0; j--) {
      prefix++;
      if ((octet >> j) & 1 === 0) {
        break;
      }
    }
  }

  return prefix;
}
```