```ts
/**
 * The factorial of n.
 */
export function factorial(n: number): number {
  /**
   * Throws Error if n is negative or non-integer.
   */
  if (typeof n !== "number" || !Number.isInteger(n) || n < 0) {
    throw new Error("Input must be a non-negative integer.");
  }

  // Fix base case to stop at 0
  return n === 0 ? 1 : n * factorial(n - 1);
}
```