0

Right now I'm following the theming react-native-paper guide for custom theming. But when trying to consume the theme via the useTheme hook, it looks like that the response I've got as a theme object is not properly/fully typed and respectively I'm not able to use the object destructuring autocomplete.

export const LightTheme = {
  ...PaperDefaultTheme,
  colors: {
    customColor: 'green',
  },
};

<PaperProvider
  theme={
    colorScheme === "dark"
      ? { ...DarkTheme }
      : { ...LightTheme }
}
>
  <AppProvider>
    {{...}}
  </AppProvider>
</PaperProvider>

Here VSCode displays that the inferred type for the theme object is const theme: Theme but does not recognise the theme properties when trying the access them:

import { useTheme } from "react-native-paper";

const theme = useTheme();
// e.g. theme.colors is not autocompleted

Currently as a solution I'm wrapping the useTheme hook in a custom one that returns the desired Theme type from my typings:

import { useTheme as _useTheme } from "react-native-paper";
import { Theme } from "../theme";

export function useTheme(): Theme {
  const theme = _useTheme();
  return theme;
}

At the time of writing, I'm using version 5.0.0-rc.6 5.0.1

z_lander
  • 104
  • 1
  • 8

1 Answers1

2

As far as the types files show, useTheme has a generic parameter to support a typed object such as:

const myTheme = { ... };
type MyTheme = typeof myTheme;
const theme = useTheme<MyTheme>()

Of course, for the sake of reusability you could mix this with your provided solution:

import { useTheme as _useTheme } from "react-native-paper";
import { Theme } from "../theme";

export function useTheme() {
  const theme = _useTheme<Theme>();
  return theme;
}
dmmarmol
  • 36
  • 4
  • Thank you for the answer! Couldn't find that solution with the v5 release candidates, but it is now well documented after the official release. – z_lander Dec 13 '22 at 18:01