反应与泛型

在React中使用泛型

我将写一个使用React的泛型示例。

请提供示例代码。

~/develop/generics_react$ tree -I node_modules 
.
├── package.json
├── public
│   ├── favicon.ico
│   ├── index.html
│   ├── logo192.png
│   ├── logo512.png
│   └── manifest.json
├── src
│   ├── App.css
│   ├── App.tsx
│   ├── components
│   │   ├── Dialog.tsx
│   │   ├── Display.tsx
│   │   └── SelectList.tsx
│   ├── index.tsx
│   └── types
│       └── type.ts
├── tsconfig.json
└── yarn.lock
import React from 'react';
import './App.css';
import { Dialog, DisplayList } from './components/Display';

function App() {
  const display: JSX.Element = <div>hello</div>;
  const dialog = Dialog();

  return (
    <div className="App">
      <DisplayList content={display} />
      <DisplayList content={dialog} />
      {/* // これはエラーになる.
    // <DisplayList content=""> */}
    </div>
  );
}

export default App;
export type Kitten = {
  id: string;
  cuteName: string;
  cutePic: string;
};

export type Bear = {
  id: string;
  name: string;
  imageUrl: string;
};

export type Animal = Kitten | Bear;

export type Dialog = {
  content: React.ReactNode; // ここで渡されるコンポーネントを受け取る型を指定
};

export type PageLink = {
  content: React.ReactNode; // ここで渡されるコンポーネントを受け取る型を指定
  url: string;
};

export type DisplayProps<T extends JSX.Element> = {
  content: T;
};

export const DisplayList = <T extends JSX.Element>({
  content,
}: DisplayProps<T>) => {
  return content;
};

export const Dialog = () => {
  return (
    <div>
      <dialog open>
        <p>Greetings, one and all!</p>
        <form method="dialog">
          <button>OK</button>
        </form>
      </dialog>
    </div>
  );
};

export const PageLink = () => {
  return (
    <div>
      <nav>
        <ul>
          <li>
            <button>ボタン1</button>
          </li>
          <li>
            <button>ボタン2</button>
          </li>
        </ul>
      </nav>
    </div>
  );
};

这样总算能用了。

export type DisplayProps<T extends JSX.Element> = {
  content: T;
};

这里很重要,DisplayProps只允许使用JSX.Element。没有这个,就等同于any类型。
只有这么写,我们无法充分享受泛型的好处,所以下次的文章中我们将深入讨论泛型。

广告
将在 10 秒后关闭
bannerAds