как настроить функцию печати для нативных объектов в clojurescript - PullRequest
0 голосов
/ 01 июля 2018

Я хочу настроить отображение элемента реакции, это код:

(require ["react" :as react])    

(defn react-element? [obj]
  (if-let [sym (aget obj "$$typeof")]
    (= js/Symbol
       (type sym))))

(extend-protocol IPrintWithWriter
  object
  (-pr-writer [obj writer _]
    (js/console.log "hello")
    (cond (react-element? obj)
          (write-all writer
                     (-> (js->clj obj)
                         (dissoc "$$typeof")
                         str))

          :else
          (write-all writer (str obj)))))

(react/createElement "h2" nil "Hello, World!")

Я ожидаю, что результат будет

{:type "h2", :key nil, :ref nil, :props {:children "Hello, World!"}}}

но он по-прежнему печатает обычный элемент #js:

#js {"$$typeof" Symbol(react.element), 
     :type "h2", :key nil, :ref nil, 
     :props #js {:children "Hello, World!"}, :_owner nil}

Есть ли способ настроить это поведение?

1 Ответ

0 голосов
/ 09 июля 2018

Основная причина в том, что в стандартном коде печати lib используется implements? и satisfies? не используется. Это эффективно ограничивает переопределения печати вещами, которые не являются нативными типами. (implements? не работает на нативных типах).

Это не может быть преднамеренным и может быть исправлено с помощью https://dev.clojure.org/jira/browse/CLJS-2812

...