引起对这个问题好奇的原因是因为,发现在日常开发中,即用了JSX.Element,又用了ReactNode,对此颇有些困惑
stackoverflow也有一样的困惑
ReactNode
可以说是最大的层级
我们可以顺着类型声明往上找可以发现
type ReactNode = ReactChild | ReactFragment | ReactPortal | boolean | null | undefined;
复制代码
ReactNode是联合类型,由 ReactChild、ReactFragment、ReactPortal、boolean、null、undefined
的集合.
- props.children是ReactNode类型
- class组件render返回的是ReactNode类型
ReactChild
type ReactChild = ReactElement | ReactText;
type ReactText = string | number;
type Key = string | number;
interface ReactElement<P = any, T extends string | JSXElementConstructor<any> = string | JSXElementConstructor<any>> {
type: T;
props: P;
key: Key | null;
}
复制代码
ReactFragment
interface ReactNodeArray extends Array<ReactNode> {}
type ReactFragment = {} | ReactNodeArray;
复制代码
ReactPortal
interface ReactPortal extends ReactElement {
key: Key | null;
children: ReactNode;
}
复制代码
JSX.Element
与ReactElement类似
declare global {
namespace JSX {
interface Element extends React.ReactElement<any, any> { }
}
}
复制代码
由以上可以看出, JSX.Element是继承React.Element. 并且函数式组件一般返回JSX.Element
图中函数组件infer类型为JSX.Element
其它-Node与Element的区别
Node 是一个接口,各种类型的 DOM API 对象会从这个接口继承
Node的类型
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END