React.memo 的 Typescript 通用类等效项

Thu*_*San 9 generics memo typescript reactjs

有没有办法在 React.memo 中设置新的泛型?

例如,对于类组件,我可以使用

// set generic
class GenericClass<G extends string | number> extends PureComponent {}

// and use like this
<GenericClass<number> />
Run Code Online (Sandbox Code Playgroud)

在下面的场景中,我想让 G 型泛型。

type G = string;
const MemoComponent = memo<{ value: G; onValueChange: (newValue: G) => void }>(
  ({ value, onValueChange }) => {
    return (
      <select
        onClick={() => {
          // do calculation
          onValueChange(value);
        }}
      >
        Button
      </button>
    );
  }
);
Run Code Online (Sandbox Code Playgroud)

我想知道有没有办法在 React.memo 中设置泛型?例如,像下面

const MemoComponent = <G extends string | number | object>React.memo<{value: G}>(({value}) => component)

// and use like this
<MemoComponent<number> />
Run Code Online (Sandbox Code Playgroud)

小智 32

您可以编写自己的包装器而不使用类型断言(as):

const genericMemo: <T>(component: T) => T = memo

function GenericComponent<Value>({props: PropsWithGeneric<Value>}) {
  return <div />
}

export const GenericMemoComponent = genericMemo(GenericComponent)
Run Code Online (Sandbox Code Playgroud)

  • 这比评级更高的答案要好得多,因为使用类型断言很少是一个好主意。谢谢德米特里·维吉尔斯。 (3认同)

Raf*_*cio 23

我有同样的问题并像这样解决了。

    interface ISomeComponentWithGenericsProps<T> { value: T; } 

    function SomeComponentWithGenerics<T>(props: ISomeComponentWithGenericsProps<T>) {
      return <span>{props.value}</span>;
    }

    export default React.memo(SomeComponentWithGenerics) as typeof SomeComponentWithGenerics;

Run Code Online (Sandbox Code Playgroud)