reactjs - React + TypeScript 仅允许特定类型的子级

标签 reactjs typescript

我在尝试仅允许将特定子项传递给组件时遇到了麻烦。

这是我的组件,HeaderLink

import { SFC, ReactElement } from "react";

import "./Header.scss";

export interface IHeaderLinkProps {
  url: string;
  label: string;
}

const HeaderLink: SFC<IHeaderLinkProps> = ({ url, label }): ReactElement => (
  <li className="nav-item">
    <a href={url}>{label}</a>
  </li>
);

export default HeaderLink;

和标题

import { SFC, ReactElement } from "react";
import { IHeaderLinkProps } from "./HeaderLink";

import "./Header.scss";

interface IHeaderProps {
  children: ReactElement<IHeaderLinkProps> | ReactElement<IHeaderLinkProps>[];
}

const Header: SFC<IHeaderProps> = ({ children }): ReactElement => {
  return (
    <header className="header">
      <div className="container">
        <div className="row">
          <div className="col">
            <img
              className="header__logo"
              src={"/logo.png"}
              alt="monqrime-logo"
            />

            <ul className="header__nav">{children}</ul>
          </div>
        </div>
      </div>
    </header>
  );
};

所以问题是我只想允许 HeaderLink 组件作为子组件传递给 Header,但我当前的解决方案仍然允许我将所有内容都作为子组件。

最佳答案

我可能会将 IHeaderProps.children 声明为:

children: React.ReactElement<IHeaderProps> | React.ReactElement<IHeaderProps>[];

考虑到有一个和多个 child 的可能性。

无论如何,你想要的都是不可能的。请参阅:

您可以做的是声明一个 prop,比如说 links?: IHeaderLinkProps[],来传递创建这些 HeaderLink 所需的 props,而不是比它们的 JSX 更重要,并将它们渲染在 Header 中:

interface IHeaderProps {
  children?: never;
  links?: IHeaderLinkProps[];
}

...

const Header: React.FC<IHeaderProps> = ({ links }) => {
  return (
    ...

    <ul className="header__nav">
      { links.map(link => <HeaderLink key={ link.url } { ...link } />) }
    </ul>

    ...
  );
};

关于reactjs - React + TypeScript 仅允许特定类型的子级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59381291/

相关文章:

javascript - 类型错误 : Cannot read property 'firstChild' of undefined While rendering the react page server side

javascript - 如何构建 TypeScript

javascript - WebSocket,即使在触发 onopen 事件后,仍处于 CONNECTING 状态

css - 如何解决这个问题?是否使用 webpack?

javascript - 如何从 React 组件中的另一个文件调用函数

javascript - 如何访问 Angular 4 服务中的 DOM 元素?

typescript - 如何在 typescript 中将枚举映射到另一个枚举?

javascript - 联合接口(interface)类型上不存在属性

javascript - 如何更改react-bootstrap导航栏链接的悬停效果?

javascript - react : FitBounds issue when passing array of longlat - react-mapbox-gl