javascript - 在 Typescript React App 中指定特定的道具并接受一般的 HTML 道具
问题描述
我有一个 React Wrapper 组件,它接受一些道具,但将所有其他道具转发给子组件(尤其是与 className、id 等原生道具相关)。
但是,当我传递原生道具时,Typescript 会抱怨。查看错误信息:
TS2339:类型“IntrinsicAttributes & IntrinsicClassAttributes< Wrapper> & Readonly< { children?: ReactNode; 上不存在属性“className” }> & 只读< WrapperProps>'。
如何获得具有特定道具的组件,该组件也接受本机道具(不接受任何道具并放弃类型检查)?
我的代码如下所示:
interface WrapperProps extends JSX.IntrinsicAttributes {
callback?: Function
}
export class Wrapper extends React.Component<WrapperProps>{
render() {
const { callback, children, ...rest } = this.props;
return <div {...rest}>
{children}
</div>;
}
}
export const Test = () => {
return <Wrapper className="test">Hi there</Wrapper>
}
仅供参考:我在这里发现了一个类似的问题,但答案基本上放弃了类型检查,我想避免这种情况:Link to SO-Question
解决方案
我们可以看看div
props 是如何定义的:
interface IntrinsicElements {
div: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
}
如果我们使用React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>
作为基本类型,我们将拥有div
. 由于DetailedHTMLProps
只是添加ref
到React.HTMLAttributes<HTMLDivElement>
我们可以使用它作为基本接口来获取所有div
属性:
interface WrapperProps extends React.HTMLAttributes<HTMLDivElement> {
callback?: Function
}
export class Wrapper extends React.Component<WrapperProps>{
render() {
const { callback, children, ...rest } = this.props;
return <div {...rest}>
{children}
</div>;
}
}
export const Test = () => {
return <Wrapper className="test">Hi there</Wrapper> // works now
}
推荐阅读
- ruby - 使用 column_names 时有没有办法减少 counter_culture gem?
- mips - MIPS 中的 sw 和 lw 是否存储低于或高于堆栈指针的值?
- javafx - JavaFX removeEventHandler 未按预期工作
- android-studio - 如何在 android studio 3.5 中调整模拟器的大小
- php - 如何在数据库中获取数据并显示在“选择”下拉列表中
- ios - 无法通过单击 URL 方案深层链接来调用 swizzling AppDelegate 实例方法 application(_:open:options:)
- c# - ASP.Net Core 3.0 SignalR HubConnection.InvokeAsync 抛出:'whatever' 的 JSON 属性名称与另一个属性冲突
- flutter - Flutter:sliberAppBar 将图标粘贴到底部
- android - 为什么使用以下代码在 onPostExecute() 中调用 progressDialog.dismiss() 不能正常工作?
- python - 我的 tensorflow 卷积神经网络没有训练