【发布时间】:2021-08-30 23:00:17
【问题描述】:
我目前正在将一个 React 应用程序迁移到 TypeScript。到目前为止,这工作得很好,但我的 render 函数的返回类型有问题,特别是在我的函数组件中。
我一直使用JSX.Element作为返回类型,现在如果组件决定不渲染任何东西,这将不再起作用,即返回null,因为null是JSX.Element 的值无效。这是我旅程的开始。我在网上搜索,发现您应该改用ReactNode,其中包括null 和其他一些可能发生的事情。
但是,在创建函数式组件时,TypeScript 会抱怨 ReactNode 类型。同样,经过一番搜索,我发现,对于功能组件,您应该改用 ReactElement。但是,如果我这样做,兼容性问题就消失了,但现在 TypeScript 再次抱怨 null 不是有效值。
长话短说,我有三个问题:
-
JSX.Element、ReactNode和ReactElement有什么区别? - 为什么类组件的
render方法返回ReactNode,而函数组件返回ReactElement? - 对于
null,我该如何解决这个问题?
【问题讨论】:
-
我很惊讶会出现这种情况,因为通常您不需要使用组件指定返回类型。你为组件做什么类型的签名?对于类,应该类似于
class Example extends Component<ExampleProps> {,对于函数组件应该类似于const Example: FunctionComponent<ExampleProps> = (props) => {(其中ExampleProps是预期道具的接口)。然后这些类型有足够的信息可以推断出返回类型。 -
类型定义here
-
@NicholasTower 我们的 linting 规则强制明确提供返回类型,这就是出现这种情况的原因(恕我直言,这是一件好事,因为您对自己所做的事情的思考更多,这有助于理解,而不是如果你只是让编译器推断一切)。
-
很公平,我没有想到 linting 规则。
-
@JonasWilms 感谢您的链接,但我认为这不能回答我的问题。
标签: javascript reactjs typescript