也许我过于简化了,但源代码表明 ReactElement 是一个具有 ReactNode 和key
和ref
属性的javascript对象。我不会在 vDom / scaladoc 评论中投入太多的股票。它们的存在是为了向用户而不是编译器提供提示。它试图说“ReactElement 是 ReactComponentElement 和 ReactDomElement 的共同基本特征”,你可以看到这确实是真的。
/** ReactElement = ReactComponentElement | ReactDOMElement */
@js.native
trait ReactElement extends Object with ReactNode {
def key: UndefOr[String] = js.native
def ref: UndefOr[String] = js.native
}
/** A React virtual DOM element, such as 'div', 'table', etc. */
@js.native
trait ReactDOMElement extends ReactElement {
def `type`: String = js.native
def props : Object = js.native
}
/** An instance of a React component. Prefer using the subtype ReactComponentU instead. */
@js.native
trait ReactComponentElement[Props]
extends ReactElement
with HasProps[Props]
这里的关键是 React 是一个相当动态的 JavaScript 框架,所以为了在它周围添加类型安全性,scala.js 最终会创建许多“相似但不相同”的子类型来处理各种底层状态。例如,ReactComponentU
和朋友和ReactComponent
/ ReactComponentElement
。
我认为为了比以前更成功地记录它(更多?),您可能必须记录 React 本身,然后使用类型系统对其进行记录——尝试严格按照 scala.js 来解释事情界面可能相当混乱。