React children 应该设置为啥 TypeScript 类型?

Posted

技术标签:

【中文标题】React children 应该设置为啥 TypeScript 类型?【英文标题】:What TypeScript type should React children be set to?React children 应该设置为什么 TypeScript 类型? 【发布时间】:2021-02-19 16:09:59 【问题描述】:

这是我的布局:

export default function Layout(children:any) 
  return (
    <div className=`$styles.FixedBody bg-gray-200`>
      <main className=styles.FixedMain>
        <LoginButton />
         children 
      </main>

      <footer>
        <FooterNavigation />
      </footer>
    </div>
  )

还有我的应用:

function MyApp( Component, pageProps ) 
  return (
    <Layout>
      <Component ...pageProps />
    </Layout>
  )

为了使我的代码更简洁,我想将Layout(children:any) 设置为实际类型而不是任何类型,但是当我将其更改为Layout(children:ReactNode) 时,我在组件上的应用页面上收到此警告:

TS2322:类型 ' 孩子:元素; ' 不可分配给类型 '内在属性 | (IntrinsicAttributes & 字符串) | (IntrinsicAttributes & number) | (IntrinsicAttributes & false) | (IntrinsicAttributes & true) | (内在属性 & 反应元素<...>) | (IntrinsicAttributes & ReactNodeArray) | (IntrinsicAttributes & ReactPortal)'。类型'孩子:元素; ' 与类型“IntrinsicAttributes”没有共同的属性。

我应该将它设置为Layout(children:IntrinsicAttributes) 是有道理的,但是当我这样做时,没有选项可以导入它。这应该设置成什么?

【问题讨论】:

应该设置为ReactNode 【参考方案1】:

React 的类型有一个PropsWithChildren type,你可以使用:

function Layout( children : React.PropsWithChildren<>) 
    // ...

正如其他人所说,它的类型为:

children?: ReactNode;

【讨论】:

【参考方案2】:

props 是一个对象 - childrenprops 对象内的一个嵌套字段。

interface LayoutProps 
   children: React.ReactNode;


function Layout( children : LayoutProps) 

【讨论】:

以上是关于React children 应该设置为啥 TypeScript 类型?的主要内容,如果未能解决你的问题,请参考以下文章

pom文件出现Element 'xxxxxxx' cannot have character [children],because the type's content typ

为啥 React.createElement() 会创建一个对象?

为啥 $(this).children() 不能为我工作?

使用 react-router 从 this.props.children 访问 React 组件

React源码 React.Children

React.Children