#reactjs #typescript #emotion
#reactjs #typescript #эмоция
Вопрос:
Я не могу найти способ заставить тематизацию эмоций работать с TypeScript.
import React from "react";
import { ThemeProvider } from "emotion-theming";
import styled from "@emotion/styled";
const theme = {
colors: {
gray: "#ccc",
},
};
const MyComponent = styled.div((props) => ({
color: props.theme.colors.gray,
}));
const App = () => (
<ThemeProvider theme={theme}>
<MyComponent />
</ThemeProvider>
);
export default App;
В документах говорится: «По умолчанию props.theme имеет аннотацию любого типа и работает без каких-либо ошибок». Но у меня есть одно props.theme.colors.gray
: свойство ‘colors’ не существует для типа ‘object’.ts(2339)
Я что-то здесь упускаю?
Комментарии:
1. Я проверил здесь
theme
, кажется, объект: github.com/emotion-js/emotion/tree/master/packages /…2. Да,
theme
должен быть объект (как в данном случае) или функция, возвращающая объект. Я не знаю, почему TS жалуется.3. можете ли вы создать codesandbox, воссоздающий это? Я не уверен, что смогу это решить, но я очень хочу посмотреть, что происходит
Ответ №1:
Эмоция 11 упростила это.
Определите вашу тему в emotion.d.ts
файле
declare module '@emotion/react' {
export interface Theme {
colors : {
primary: string;
secondary: string;
};
}
}
Это обеспечивает переопределение для пустого Theme
интерфейса в Emotion.
Комментарии:
1. И куда вы помещаете этот файл и как его использовать? Документы мне непонятны.
2. @Ini Я добавил ответ, продолжающий отвечать на ваш вопрос.
Ответ №2:
Продолжая полезный ответ @ chatian, после того, как вы создали файл .d.ts, поместите его куда-нибудь в свой проект, например, в папку «src», и укажите его как «окружающий файл», который будет использоваться средой выполнения TS вашего редактора, добавив путь к его каталогу, то "src"
есть в "include"
массиве вашего tsconfig.json
файла.
Теперь вы должны иметь возможность использовать как свои собственные типы, так и импортировать типы, которые вы расширяете из emotion, в свои файлы tsx, например, import { Theme } from "@emotion/react"
.
Пример codesandbox: https://codesandbox.io/s/9z2md?file=/src/global.d.ts
Обратите внимание, поскольку тип темы в приведенном выше примере не является «расширяющим» типом темы emotion, вам вообще не нужно его импортировать, и у вас есть доступ к нему глобально.
(примечание: эта песочница была создана не мной, поэтому заслуга принадлежит nerdyman.)