自定义主题样式组件的打字稿
typescript for custom theme styled components
我已经根据一些 google 搜索尝试了 2 种不同的方法来做到这一点。
我正在尝试为 typescript expo reactive native 项目 中的自定义主题设置类型。
我已经设置了一个声明 ts 文件并将其添加到我在 tsconfig 中的包含中。这是我的设置。希望有人遇到过类似的问题并且知道如何解决这个问题。
我有一个包含以下文件的主题文件夹,我导出这些文件然后导入到索引主题文件中。
themes/
colors
sizes
spacing
index
这是从上述主题文件导入的索引文件。
import { DefaultTheme } from "styled-components/native";
import { colors } from "./colors";
import { sizes } from "./sizes";
import { spacing, lineHeights } from "./spacing";
const theme: DefaultTheme = {
colors,
sizes,
spacing,
lineHeights,
};
export default theme;
然后我有了我的声明文件,我尝试了两种方法,一种是手动添加所有道具,另一种是使用 typeof。
types/theme.d.ts
import {} from "styled-components";
import theme from "../themes";
declare module "styled-components" {
type Theme = typeof theme;
export interface DefaultTheme extends Theme {}
}
// Manually adding the props.
// import { DefaultTheme } from "styled-components/native";
// declare module "styled-components" {
// export interface DefaultTheme {
// bg: {
// primary: string;
// secondary: string;
// };
// sizes: stringp[];
// lineHeights: {
// title: string;
// copy: string;
// };
// spacing: string[];
// }
// }
tsconfig.json
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
"baseUrl": ".",
"paths": {
"*": ["types/*"]
},
},
"include": ["./src", "./types"],
"exclude": [
"node_modules",
"**/*.test.ts",
"**/*.test.tsx",
]
}
这就是我在 tsx 应用程序文件中使用它的方式。
App.tsx
import React from "react";
import styled, { ThemeProvider } from "styled-components/native";
import { Text, StatusBar } from "react-native";
import theme from "./src/themes";
export default function App() {
return (
<ThemeProvider theme={theme}>
<Container>
<Text>some text</Text>
<StatusBar />
</Container>
</ThemeProvider>
);
}
const Container = styled.View`
flex: 1;
background-color: ${({ theme }) => theme.colors.bg.primary};
align-items: center;
justify-content: center;
`;
不要在 themes/index.ts
中设置 DefaultTheme
。它已经被使用过,只是一个空对象。
将您的 themes/index.ts
更新为:
import { colors } from "./colors";
import { sizes } from "./sizes";
import { spacing, lineHeights } from "./spacing";
const theme = {
colors,
sizes,
spacing,
lineHeights,
};
export default theme;
更新你的 types/theme.d.ts
这个:
import "styled-components"
import theme from "./src/themes";
type ThemeInterface = typeof theme
declare module "styled-components" {
// eslint-disable-next-line @typescript-eslint/no-empty-interface (this is only necessary if you ur eslint complains. Since it should be and Interface and not a Type.)
interface DefaultTheme extends ThemeInterface {}
}
而你应该是 gucci。
我已经根据一些 google 搜索尝试了 2 种不同的方法来做到这一点。 我正在尝试为 typescript expo reactive native 项目 中的自定义主题设置类型。 我已经设置了一个声明 ts 文件并将其添加到我在 tsconfig 中的包含中。这是我的设置。希望有人遇到过类似的问题并且知道如何解决这个问题。
我有一个包含以下文件的主题文件夹,我导出这些文件然后导入到索引主题文件中。
themes/
colors
sizes
spacing
index
这是从上述主题文件导入的索引文件。
import { DefaultTheme } from "styled-components/native";
import { colors } from "./colors";
import { sizes } from "./sizes";
import { spacing, lineHeights } from "./spacing";
const theme: DefaultTheme = {
colors,
sizes,
spacing,
lineHeights,
};
export default theme;
然后我有了我的声明文件,我尝试了两种方法,一种是手动添加所有道具,另一种是使用 typeof。
types/theme.d.ts
import {} from "styled-components";
import theme from "../themes";
declare module "styled-components" {
type Theme = typeof theme;
export interface DefaultTheme extends Theme {}
}
// Manually adding the props.
// import { DefaultTheme } from "styled-components/native";
// declare module "styled-components" {
// export interface DefaultTheme {
// bg: {
// primary: string;
// secondary: string;
// };
// sizes: stringp[];
// lineHeights: {
// title: string;
// copy: string;
// };
// spacing: string[];
// }
// }
tsconfig.json
{
"extends": "expo/tsconfig.base",
"compilerOptions": {
"strict": true,
"baseUrl": ".",
"paths": {
"*": ["types/*"]
},
},
"include": ["./src", "./types"],
"exclude": [
"node_modules",
"**/*.test.ts",
"**/*.test.tsx",
]
}
这就是我在 tsx 应用程序文件中使用它的方式。
App.tsx
import React from "react";
import styled, { ThemeProvider } from "styled-components/native";
import { Text, StatusBar } from "react-native";
import theme from "./src/themes";
export default function App() {
return (
<ThemeProvider theme={theme}>
<Container>
<Text>some text</Text>
<StatusBar />
</Container>
</ThemeProvider>
);
}
const Container = styled.View`
flex: 1;
background-color: ${({ theme }) => theme.colors.bg.primary};
align-items: center;
justify-content: center;
`;
不要在 themes/index.ts
中设置 DefaultTheme
。它已经被使用过,只是一个空对象。
将您的 themes/index.ts
更新为:
import { colors } from "./colors";
import { sizes } from "./sizes";
import { spacing, lineHeights } from "./spacing";
const theme = {
colors,
sizes,
spacing,
lineHeights,
};
export default theme;
更新你的 types/theme.d.ts
这个:
import "styled-components"
import theme from "./src/themes";
type ThemeInterface = typeof theme
declare module "styled-components" {
// eslint-disable-next-line @typescript-eslint/no-empty-interface (this is only necessary if you ur eslint complains. Since it should be and Interface and not a Type.)
interface DefaultTheme extends ThemeInterface {}
}
而你应该是 gucci。