```ts

export function parseSemver(version: string): { major: number; minor: number; patch: number; prerelease: string | null; build: string | null } {
    const regex = /^[0-9]+(\.[0-9]+){2}(-[a-zA-Z0-9_.-]*)?(\+[a-zA-Z0-9_.-]*)?$/;
    if (!regex.test(version)) {
        throw new Error(`Invalid SemVer: ${version}`);
    }

    const [_, major = 0, minor = 0, patch = 0] = version.split('.').map(Number);
    const prerelease = ((version.match(/-([a-zA-Z0-9_.-]*)/) || [])[1]) || null;
    const build = ((version.match(/\+([a-zA-Z0-9_.-]*)/) || [])[1]) || null;

    return {
        major,
        minor,
        patch,
        prerelease,
        build
    };
}
```