最佳答案
使用 TypeScript 和 React,我们不再需要扩展 React.Props
来让编译器知道所有的 React 组件道具都可以有子道具:
interface MyProps { }
class MyComponent extends React.Component<MyProps, {}> {
public render(): JSX.Element {
return <div>{this.props.children}</div>;
}
}
然而,无状态函数组件似乎并非如此:
const MyStatelessComponent = (props: MyProps) => {
return (
<div>{props.children}</div>
);
};
发出编译错误:
错误: (102,17) TS2339: 类型上不存在“子类型”属性 “ MyProps”。
我猜这是因为编译器实际上无法知道在 props 参数中给出的是普通函数 children
。
所以问题是我们应该如何在 TypeScript 的无状态函数组件中使用子组件?
我可以回到 MyProps extends React.Props
的老方法,但是 Props
接口是 被标记为已废弃的,而且无状态组件没有或者支持我所理解的 Props.ref
。
所以我可以手动定义 children
道具:
interface MyProps {
children?: React.ReactNode;
}
第一: ReactNode
是正确的类型吗?
第二: 我必须把子元素写成可选的(?
) ,否则消费者会认为 children
应该是组件的 属性(<MyStatelessComponent children={} />
) ,如果没有提供值,就会产生错误。
我好像漏掉了什么。有没有人可以澄清一下我的最后一个示例是否是在 React 中对孩子们使用无状态函数组件的方法?