使用泛型反应上下文

Sim*_*nti 6 generics typescript reactjs react-context

我们如何在 React.CreateContext 中使用泛型?

我有这个:

interface Props {
}

export interface SearchContextProps {
  dtos: any[];
}

export const SearchContext = React.createContext<SearchContextProps>({
  dtos: []
});

const SearchPage: React.FunctionComponent<Props> = (props) => {
  const [dtos, setDtos] = React.useState<any[]>([]);

  const searchContext = {
    dtos: dtos
  };

  return (
    <SearchContext.Provider value={searchContext}>
      ...
    </SearchContext.Provider>
  );
}

export default SearchPage;
Run Code Online (Sandbox Code Playgroud)

现在我想使用泛型,所以我会写这样的内容:

interface Props<T> {
}

export interface SearchContextProps<T> {
  dtos: T[];
}

export const SearchContext = React.createContext<SearchContextProps<T>>({
  dtos: []
});

const SearchPage = <T extends object>(props: Props<T>) => {
  const [dtos, setDtos] = React.useState<T[]>([]);

  const searchContext = {
    dtos: dtos
  };

  return (
    <SearchContext.Provider value={searchContext}>
      ...
    </SearchContext.Provider>
  );
}

export default SearchPage;
Run Code Online (Sandbox Code Playgroud)

但我不知道如何才能开始工作:

export const SearchContext = React.createContext<SearchContextProps<T>>({
Run Code Online (Sandbox Code Playgroud)

我如何在这里使用泛型,我如何访问 T?

我尝试在组件内移动上下文:

interface Props<T> {
}

export interface SearchContextProps<T> {
  dtos: T[];
}

const SearchPage = <T extends object>(props: Props<T>) => {
  const [dtos, setDtos] = React.useState<T[]>([]);

  const SearchContext = React.createContext<SearchContextProps<T>>({
    dtos: [],
  });

  const searchContext = {
    dtos: dtos,
  };

  return (
    <SearchContext.Provider value={searchContext}>
      ...
    </SearchContext.Provider>
  );

}

export default SearchPage;
Run Code Online (Sandbox Code Playgroud)

但现在我不知道如何导出它。

有什么帮助吗?

Sim*_*nti 2

我最终得到:

import * as React from 'react';

interface Props<T> {}

export interface SearchContextProps<T> {
  dtos: T[];
}

export const SearchContext = React.createContext<SearchContextProps<any>>({
  dtos: [],
});

const SearchPage = <T extends object>(props: React.PropsWithChildren<Props<T>>) => {
  const [dtos, setDtos] = React.useState<T[]>([]);

  const searchContext = {
    dtos: dtos,
  };

  return <SearchContext.Provider value={searchContext}>...</SearchContext.Provider>;
};

export default SearchPage;
Run Code Online (Sandbox Code Playgroud)

而消费者

const searchContext = React.useContext<SearchContextProps<Interfaces.FileDto>>(SearchContext)
Run Code Online (Sandbox Code Playgroud)