```typescript
export function parseSemver(version: string): { major: number; minor: number; patch: number; prerelease: string | null; build: string | null } {
  const regex = /^(\d+)(?:\.(\d+))(?:\.(\d+))?(?:-([a-zA-Z0-9-]+))?(?:\+([a-zA-Z0-9-]+))?$/;
  const match = version.match(regex);

  if (!match) {
    throw new Error(`Invalid semver version: ${version}`);
  }

  const [, major, minor, patch, prerelease, build] = match;

  // Convert parsed parts to numbers
  const result = {
    major: parseInt(major, 10),
    minor: parseInt(minor || '0', 10),
    patch: parseInt(patch || '0', 10),
    prerelease: prerelease ? prerelease : null,
    build: build ? build : null,
  };

  return result;
}
```