javascript - 如果数组返回子级或子级映射时如何正确替换任何类型
问题描述
我有一个 React 函数组件来检查 children 是否是一个数组。如果它不是数组,则返回它。否则它会映射孩子并返回一些 JSX。
import React from 'react'
interface Props {
children: React.ReactNode
}
const LineBreak: React.FC<Props> = ({ children }): any => {
if (!Array.isArray(children)) return children
return (
<>
{children.map((child, i, arr) => {
if (i + 1 === arr.length) return child
return <>{child}<br /></>
})}
</>
)
}
export default LineBreak
我想做的是替换第any
7 行。从逻辑上讲,我认为将其更改为React.ReactNode
就足够了,但这会引发类型错误:
Type '({ children }: PropsWithChildren<Props>) => ReactNode' is not assignable to type 'FC<Props>'. Type 'ReactNode' is not assignable to type 'ReactElement<any, any>'. Type 'string' is not assignable to type 'ReactElement<any, any>'.ts(2322)
我真的可以使用一些关于如何正确阅读这些错误消息的指针。
我还尝试通过将返回类型更改为string|React.ReactNode
并预期相同的错误来绕过此错误消息,因为根据我有限的打字稿知识,React.ReactNode 包含类型字符串。
解决方案
我能够用两种不同的方法解决这个问题。
- 从函数中删除 React.FC 类型。
import React from 'react'
interface Props {
children: React.ReactNode
}
const LineBreak = ({children}: Props): React.ReactNode => {
if (!Array.isArray(children)) return children
return (
<>
{children.map((child, i, arr) => {
if (i + 1 === arr.length) return child
return <>{child}<br /></>
})}
</>
)
}
export default LineBreak
- 将单个子返回包裹在 Fragment 内。
import React from 'react'
interface Props {
children: React.ReactNode
}
const LineBreak: React.FC<Props> = ({children}): JSX.Element => {
if (!Array.isArray(children)) return <>{children}</>
return (
<>
{children.map((child, i, arr) => {
if (i + 1 === arr.length) return child
return <>{child}<br /></>
})}
</>
)
}
export default LineBreak
根据我现在的理解,React.FC 只能是 JSX.Element 或等效的返回类型。虽然 children 可能是不符合 JSX.Element 类型的字符串、布尔值、{} 类型。因此,如果我想控制返回类型,那么我必须删除 React.FC,或者如果我想使用 React.FC,那么我需要将子项的返回包装在一个片段中,以便它正确返回各种子类型作为有效的 JSX.Element 类型。
推荐阅读
- php - 替换 div 元素的第二个相同类的类名
- java - 如何使用 runAsync 等待完全完成的未来?
- ios - 将@objc 方法作为操作添加到按钮并获取“'#selector' 的参数不引用'@objc' 方法、属性或初始化程序”
- jenkins - 在 Jenkins Scripted Pipeline 中使用 WORKSPACE 驱动器
- java - Springboot Autowire 抽象类中的新对象
- php - php proc_open() 和stockfish 国际象棋引擎异常深度1
- javascript - 如何使用带有 JavaScript 的 JSON 数据创建 HTML 表
- javascript - 使某些 JS 代码比另一个更重要(鼠标移出时消失)
- javascript - 延迟随机位置jQuery
- entity-framework - EntityType 'IdentityUserLogin' 没有定义键。尝试设置外键后