   (the instance) produces an element."
   ([ob' ob]
    (with-latest-from vector ob' ob))
-  ([f ob' ob]
+  ([f ob' ^observable ob]
    (.withLatestFrom ob ob' f)))
 
 (defn catch
   "Continues an observable sequence that is terminated
   by an exception with the next observable sequence."
-  [handler ob]
+  [handler ^observable ob]
   {:pre [(or (observable? handler)
              (fn? handler))]}
   (.catch ob handler))

(defn choice
  "Create an observable that surfaces any of the given
  sequences, whichever reacted first."
  ([a b]
   {:pre [(observable? a)
          (observable? b)]}
   (.amb a b))

(defn publish
  "Create a connectable (hot) observable
  from other observable."
  ([^observable ob]
   (publish ob true))
  ([^observable ob connect?]
   {:pre [(observable? ob)]}
   (let [ob' (.publish ob)]
     (when connect?
