javascript - 在 Typescript React App 中指定特定的 Prop 并接受一般的 HTML Prop

标签 javascript reactjs typescript react-props

我有一个 React Wrapper 组件,它接受一些 Prop ,但将所有其他 Prop 转发给子组件(尤其是与 className、id 等原生 Prop 相关的内容)。

但是,当我传递 native Prop 时,Typescript 会提示。查看错误信息:

TS2339: Property 'className' does not exist on type 'IntrinsicAttributes & IntrinsicClassAttributes< Wrapper > & Readonly< { children?: ReactNode; }> & Readonly< WrapperProps>'.

我怎样才能获得一个具有特定 props 的组件也接受原生 props(接受任何 props 并放弃类型检查)?

我的代码是这样的:

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 Prop 定义:

interface IntrinsicElements {
    div: React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>;
}

如果我们使用 React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>作为基本类型,我们将拥有 div 的所有属性.自 DetailedHTMLProps只需添加 refReact.HTMLAttributes<HTMLDivElement>我们可以使用它作为基本接口(interface)来获取所有 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
}

关于javascript - 在 Typescript React App 中指定特定的 Prop 并接受一般的 HTML Prop ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51835611/

相关文章:

javascript - 如果状态改变, react 会破坏组件中的所有旧 dom 吗?

javascript - 为什么我在尝试过滤电影 release_date 时变得不确定?

javascript - Reactjs获取URL路径名id

angular - 无法绑定(bind)到 'qrc-value',因为它不是 Ionic 4.2.0 中 'ngx-qrcode' 的已知属性

angular - 将对象放入@NgModule 中的提供者

javascript - 如何从另一个jsp页面刷新一个jsp页面?

javascript - WP 在主导航中添加额外的标题?

Javascript:单击使用 window.getSelection()?

typescript - Redux DevTools 现在在状态 View 中显示 typescript map 对象

javascript - 当元素处于 View 中时运行脚本