scalajs-react 中的 ReactComponent 与 ReactComponentElement

ReactComponent vs ReactComponentElement in scalajs-react

我想写一些额外的东西scalajs-react documentation,但我很困惑。

它说 here :

A ReactElement is a ReactDOMElement or a React component.

但是它说 here:

type ReactElement = ReactComponentElement | ReactDOMElement;

哪一个是正确的?

如何解释这一矛盾?

ReactComponentReactComponentElement怎么可能一样呢?

我很困惑。有人可以帮我解惑吗?

也许我过于简化了,但源代码表明 ReactElement 是一个 javascript 对象,具有 ReactNode 的属性以及 keyref 属性。我不会在 vDom / scaladoc 评论中放那么多股票。它们的存在是为了向用户而不是编译器提供提示。它试图说"ReactElement is the common base trait to ReactComponentElement and 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 最终会有许多 "similar but not identical" 子类型create 来处理各种底层状态。例如,ReactComponentU 和朋友以及 ReactComponent/ReactComponentElement

我认为为了比现在更成功地记录它(更多?),您可能必须记录 React 本身,然后用类型系统覆盖它——尝试严格地用术语解释事情scala.js 界面可能相当混乱。