ウェブサイト検索

reactjs - 複合コンポーネント - React TypeScript


私はCompound Componentsと一緒にReact TypeScriptを使おうとしていますが、次のエラーが発生しています:

JSX element type 'Nav.Content' does not have any construct or call signatures.ts(2604)

こちらがサンドボックスです: https://codesandbox.io/s/compound-components-typescript-fjilh?file=/src/App.tsx

それをどうやって直せるか、何かアイデアはありますか?

私のコードはこのようになっています:

Nav.tsx
interface ContentProps {
  children: ReactNode;
}
const Content: React.FC<ContentProps> = (props: ContentProps) => (
  <div>{props.children}</div>
);
interface ContentComposition {
  Content?: React.FC<ContentProps>;
}
interface Props {
  children: ReactNode;
}
const Nav: React.FC<Props> & ContentComposition = (props: Props) => (
  <div>{props.children}</div>
);

Nav.Content = Content;

export default Nav;

App.tsx
export default function App() {
  return (
    <div className="App">
      <Nav>
        <Nav.MainContent>
          <h2>Start editing to see some magic happen!</h2>
        </Nav.MainContent>
        <h1>Hello CodeSandbox</h1>
      </Nav>
    </div>
  );
}

回答 #1

ReactifluxのBradyのおかげで、私は答えを見つけることができました。

問題は、私が React.FC を使用していたことでした

React.FC に関する詳細はこちら: https://github.com/typescript-cheatsheets/react-typescript-cheatsheet#function-components

こちらが答えです:

interface ContentProps {
  children: ReactNode;
}
const Content = (props: ContentProps) => <div>{props.children}</div>;

interface Props {
  children: ReactNode;
}
const Nav = (props: Props) => <div>{props.children}</div>;

Nav.Content = Content;

export default Nav;

回答 #2

これに対処する1つの方法は次のとおりです:

import React, { FC } from 'react';

interface SubComponentProps {
    /* ... */    
}
const SubComponent: FC<SubComponentProps> = () => {
    /* ... */
};

interface ParentComposition {
    Sub: typeof SubComponent; /* or you can do FC<SubComponentProps> */
}

interface ParentProps {
    /* ... */
}
const Parent: FC<ParentProps> & ParentComposition = () => {
    /* .... */
};

Parent.Sub = SubComponent;

export default Parent;

ここでの重要な点は、Compositionインターフェースを使用し、複合コンポーネントの型を宣言する際にそれを使用することです。

関連記事