我目前正在将 React 应用程序迁移到 TypeScript。到目前为止,这工作得很好,但是我的 render
函数的返回类型有问题,特别是在我的功能组件中。
我一直使用 JSX.Element
作为返回类型,现在如果组件决定 不 渲染任何东西,这将不再起作用,即返回 null
,因为 null
不是 JSX.Element
的有效值。这是我旅程的开始。我在网上搜索,发现您应该使用 ReactNode
代替,其中包括 null
以及其他一些可能发生的事情。
但是,在创建功能组件时,TypeScript 会抱怨 ReactNode
类型。再次,经过一番搜索,我发现,对于功能组件,您应该使用 ReactElement
代替。但是,如果我这样做,兼容性问题就消失了,但现在 TypeScript 再次抱怨 null
不是有效值。
长话短说,我有三个问题:
JSX.Element
,ReactNode
和ReactElement
什么区别?- 为什么类组件的
render
方法返回ReactNode
,而功能组件返回ReactElement
? - 关于
null
我该如何解决这个问题?
原文由 Golo Roden 发布,翻译遵循 CC BY-SA 4.0 许可协议
ReactElement 是具有类型和道具的对象。
ReactNode 是一个 ReactElement、一个 ReactFragment、一个字符串、一个数字或一个 ReactNode 数组,或者是 null,或者 undefined,或者是一个布尔值:
JSX.Element 是一个 ReactElement,props 的泛型类型是 any。它存在,因为各种库可以以自己的方式实现 JSX,因此 JSX 是一个全局名称空间,然后由库设置,React 设置它是这样的:
举例:
事实上,它们确实返回了不同的东西。
Component
返回:函数是“无状态组件”:
这其实是由于 历史原因。
输入为
ReactElement | null
就像 react 一样。或者让 Typescript 推断类型。类型的来源