反应打字稿和 children
React typescript and children
我尝试在打字稿中动态检查 React children 组件的类型。
以下代码运行良好,但似乎打字稿不希望我解构 children.
我收到 Typescript 错误:
TS2339: Property 'type' does not exist on type 'ReactNode'.
除了使用 // @ts-ignore.
之外,我该怎么做才能摆脱打字稿错误
import * as React from 'react';
export interface AuxProps {
children: React.ReactNode[]
}
export const Message: React.FC<AuxProps> = ({
children,
}: AuxProps) => {
const test = children.filter(({ type }) => type === Test);
return (
<div>
{test}
<div/>
);
};
这是因为默认ReactNode
没有字段类型
您可以使用 & 功能简单地添加该密钥:
export interface AuxProps {
children: (React.ReactNode & {type: string})[]
}
这会将 type
添加到元素中。
您无法从 ReactChild
读取 type
,因为 ReactChild
是一个联盟,并非该联盟的每个成员都有一个名为 [=11= 的 属性 ].
事实上,只有 ReactElement
会。
解决方案是在谓词函数中检查两件事:
- 这是child一个
ReactElement
吗?
- 如果是,那么该元素是否属于所需类型?
代码:
const test = children.filter(child => React.isValidElement(child) && child.type === 'Test');
我尝试在打字稿中动态检查 React children 组件的类型。 以下代码运行良好,但似乎打字稿不希望我解构 children.
我收到 Typescript 错误:
TS2339: Property 'type' does not exist on type 'ReactNode'.
除了使用 // @ts-ignore.
之外,我该怎么做才能摆脱打字稿错误import * as React from 'react';
export interface AuxProps {
children: React.ReactNode[]
}
export const Message: React.FC<AuxProps> = ({
children,
}: AuxProps) => {
const test = children.filter(({ type }) => type === Test);
return (
<div>
{test}
<div/>
);
};
这是因为默认ReactNode
没有字段类型
您可以使用 & 功能简单地添加该密钥:
export interface AuxProps {
children: (React.ReactNode & {type: string})[]
}
这会将 type
添加到元素中。
您无法从 ReactChild
读取 type
,因为 ReactChild
是一个联盟,并非该联盟的每个成员都有一个名为 [=11= 的 属性 ].
事实上,只有 ReactElement
会。
解决方案是在谓词函数中检查两件事:
- 这是child一个
ReactElement
吗? - 如果是,那么该元素是否属于所需类型?
代码:
const test = children.filter(child => React.isValidElement(child) && child.type === 'Test');