Машинописные шрифты с использованием стилей createUseStyles из react-jss

#reactjs #typescript #jss

Вопрос:

У меня чертовски много времени, чтобы исправить свои наброски, поэтому мне было любопытно, есть ли у кого-нибудь рабочий пример или какая-то обратная связь о том, где я ошибаюсь. Есть две вещи , которые мне нужно сделать с этим экземпляром createUseStyles , принять тему, а также реквизит.

Я взял пример с веб-сайта документации, и, конечно, сразу же он уже выдает ошибки машинописи, что понятно:

(вставка скриншота только для того, чтобы показать ошибки машинописи)

изображение

блок кода со скриншота:

 import React, { ReactNode, CSSProperties } from "react";
import {
  createUseStyles,
  useTheme,
  ThemeProvider,
  DefaultTheme,
  Styles
} from "react-jss";

interface Props {
  children: ReactNode;
  useRed: boolean;
}

interface PUTheme {
  colorPrimary: string;
  altColor: string;
}

const useStyles = createUseStyles({
  button: {
    background: ({ theme }) => theme.colorPrimary
  },
  label: {
    fontWeight: "bold"
  }
});

const Button2: React.FC<Props> = ({ children, ...props }) => {
  const theme = useTheme();
  console.log(theme);
  const classes = useStyles({ ...props, theme });
  return (
    <button className={classes.button}>
      <span className={classes.label}>{children}</span>
    </button>
  );
};

const theme = {
  colorPrimary: "green",
  altColor: "red"
};

const App = () => (
  <ThemeProvider theme={theme}>
    <Button2 useRed={true}>I am a button 2 with green background</Button2>
  </ThemeProvider>
);

export default App;

 

The error found here (Error 1) is:

   button: {
    background: ({ theme }) => theme.colorPrimary
  },
 

Property ‘colorPrimary’ does not exist on type ‘Theme’.ts(2339)

Makes sense to an extent — it doesn’t know what our theme consists of, so moving on…

The error found here (Error 2) for theme is:

 const classes = useStyles({ ...props, theme });
 

Тип «DefaultTheme» не может быть присвоен типу «Тема».
Тип «null» не может быть присвоен типу «Тема». ts(2322)

Немедленно.. Я немного сбит с толку. Но давайте наберем некоторые вещи и посмотрим, как это получится…

Добавление интерфейса для моей темы, похоже, не изменяет ни одну из вышеперечисленных ошибок:

 interface PUTheme {
  colorPrimary: string;
  altColor: string;
}

const theme: PUTheme = {
  colorPrimary: "green",
  altColor: "red"
};
 

Таким образом, поскольку добавление интерфейса к объекту моей темы, похоже, мало что дает, я смог устранить ошибку из ошибки 1, добавив типизацию. Пока это успокаивает машинописный текст, мне кажется, что это не так?

 const useStyles = createUseStyles({
  button: {
    background: ({ theme }: {theme: PUTheme}) => theme.colorPrimary
  },
  label: {
    fontWeight: "bold"
  }
});
 

Тем не менее, это все еще оставляет меня с ошибкой 2, за исключением того, что ошибка немного изменилась

Тип «DefaultTheme» не может быть присвоен типу «PUTheme». Тип «null» не может быть присвоен типу «PUTheme»

Я пытался проследить за вводом react-jss текста, но, возможно, в данный момент это выше моего понимания.

У кого-нибудь есть какие-либо советы или понимание того, что я делаю неправильно, или рабочие примеры? Кроме того, здесь есть ссылка на песочницу «Мой код«, если вы хотите увидеть ее в действии.

Комментарии:

1. Пожалуйста, используйте блоки кода вместо изображений вашего кода.

2. Я объяснил, почему в вопросе был скриншот. Это должно было показать, где происходили ошибки. Остальная часть вопроса — это блоки кода, которые, очевидно, являются предпочтительными. @LinuxServer

Ответ №1:

Вы можете попробовать некоторые заклинания, подобные этому:

 const useStyles = createUseStyles({
  button: {
    background: (theme: PUTheme) => theme.colorPrimary
  },
  label: {
    fontWeight: "bold"
  }
});

const Button2: React.FC<Props> = ({ children, ...props }) => {
  const theme = useTheme() as PUTheme;
  console.log(theme);
  const classes = useStyles(theme);
  return (
    <button className={classes.button}>
      <span className={classes.label}>{children}</span>
    </button>
  );
};
 

Обратите внимание, что он ничего не передает props useStyles . Глядя на определение типа этой функции, кажется, что она может принимать только « Theme »

Ответ №2:

Я думаю, что нашел решение. Передача темы/реквизита классам все еще кажется мне странной, но она работает и удовлетворяет машинописному тексту.

 import React, { ReactNode } from "react";
import { createUseStyles, useTheme, ThemeProvider } from "react-jss";

interface Props {
  children: ReactNode;
  useRed: boolean;
}

interface PUTheme {
  colorPrimary: string;
  altColor: string;
}

const useStyles = createUseStyles({
  button: {
    background: ({
      theme,
      useRed
    }: {
      theme: PUTheme;
      useRed: Props["useRed"];
    }) => (useRed ? theme.altColor : theme.colorPrimary)
  },
  label: {
    fontWeight: "bold"
  }
});

const Button2: React.FC<Props> = ({ children, ...props }) => {
  const theme = useTheme<PUTheme>();
  const classes = useStyles({ ...props, theme });
  return (
    <button className={classes.button}>
      <span className={classes.label}>{children}</span>
    </button>
  );
};

const theme: PUTheme = {
  colorPrimary: "green",
  altColor: "red"
};

const App = () => (
  <ThemeProvider theme={theme}>
    <Button2 useRed={true}>I am a button 2 with green background</Button2>
  </ThemeProvider>
);

export default App;

 

Главное, чего, по-моему, не хватало, — это useTheme напечатать const theme = useTheme<PUTheme>();

Посмотреть рабочую песочницу кода можно здесь!