This works:
function createInstance<D extends TypeDiscriminator>( discriminator: D, partial: Partial<Extract<TypeX, { discriminator: D }>> ) {}
It picks the right type based on the discriminator given.