首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Typechecking与样式组件的反应库

Typechecking与样式组件的反应库
EN

Stack Overflow用户
提问于 2022-01-04 12:30:24
回答 1查看 289关注 0票数 0

我目前正在一个设计系统库中工作,以测试一些东西。基本上,为了创建主题,库是一个样式化的组件包装器。我建立了这个库的类型记录,反应,样式组件和卷取作为邦德勒。

问题是当用户使用这个库时,vscode对主题声明的排版没有帮助。

这是库中的index.js。基本上是一个临时的,其中我们有一个上下文和一个来自样式组件的ThemeProvider临时。

代码语言:javascript
复制
import { createContext, useState } from "react";
import "styled-components";
import {
  DefaultTheme,
  ThemeProvider as SCThemeProvider,
} from "styled-components";
import { themes } from "./design-system/colorTheme";
import React from "react";

interface ThemeContextAPI {
  toggleTheme: () => void;
  currentTheme: DefaultTheme;
}

const ThemeContext = createContext<ThemeContextAPI | null>(null);

const ThemeProvider: React.FC<{ children?: React.ReactNode }> = ({
  children,
}) => {
  const [currentTheme, setCurrentTheme] = useState<DefaultTheme>(themes.light);

  const toggleTheme = () => {
    setCurrentTheme((prev) =>
      prev === themes.light ? themes.dark : themes.light
    );
  };

  const values: ThemeContextAPI = {
    toggleTheme,
    currentTheme,
  };

  return (
    <ThemeContext.Provider value={values}>
      <SCThemeProvider theme={currentTheme}>{children}</SCThemeProvider>
    </ThemeContext.Provider>
  );
};

export default ThemeProvider;
export { ThemeContext };

正如我们所看到的,我们有一个SCThemeProvider,它是一个来自样式组件的ThemeProvider组件。这给用户带来了,在所有样式组件中使用所有主题变量。此组件提供的主题如SC文档所述进行了扩展,因此DefaultTheme声明如下:

代码语言:javascript
复制
export interface Theme {
  primary?: Color;
  primaryContainer?: Color;
  secondary?: Color;
  secondaryContainer?: Color;
  tertiary?: Color;
  tertiaryContainer?: Color;
  cuaternary?: Color;
  cuaternaryContainer?: Color;
  // -------------
  surface?: Color;
  surfaceVariant?: Color;
  background?: Color;
  error?: Color;
  errorContainer?: Color;
  // -------------
  onPrimary?: Color;
  onPrimaryContainer?: Color;
  onSecondary?: Color;
  onSecondaryContainer?: Color;
  onTertiary?: Color;
  onTertiaryContainer?: Color;
  onCuaternary?: Color;
  onCuaternaryContainer?: Color;
  // --------------
  onSurface?: Color;
  onSurfaceVariant?: Color;
  onError?: Color;
  onErrorContainer?: Color;
  onBackground?: Color;
  outline?: Color;
  // --------------
  inverseSurface?: Color;
  inverseOnSurface?: Color;
  inversePrimary?: Color;
  colorPalette: ColorPalette<ColorSet>;
  surfaceTones: SurfaceTones;
}

declare module "styled-components" {
  export interface DefaultTheme extends Theme {}
}

库是这样使用的(示例是用next.js编写的):

代码语言:javascript
复制
import { GlobalStyle, ThemeProvider } from "rakes-design-sys";

function MyApp({ Component, pageProps }) {
  return (
    <>
      <ThemeProvider>
        <GlobalStyle />
        <Component {...pageProps} />
      </ThemeProvider>
    </>
  );
}

export default MyApp;

但是当我在一个样式化的组件中使用主题时,vscode没有显示主题的类型。我已经将TS配置配置为创建声明文件,但仍然无法工作。我只是把它放在tsconfig和rollupconfig中。

代码语言:javascript
复制
    "declaration": true,
    "declarationDir": "types",
    "emitDeclarationOnly": true

在我的汇总配置中,我使用这样的rollup plugin-dts

代码语言:javascript
复制
 {
    input: "dist/types/index.d.ts",
    output: [{ file: "dist/index.d.ts", format: "es" }],
    plugins: [dts()],
  },

这将在dist中生成一个名为types的文件夹,其中包含库中的所有文件,但具有.d.ts扩展,并在dist中创建另一个index.d.ts。

通过这种方式,当我使用上下文时,类型化工作如下:

代码语言:javascript
复制
import { ThemeContext } from "rakes-design-sys";
import { useContext, useEffect } from "react";
import { OHeader } from "../styles/organisms/OHeader.styles";

const App = () => {
  const { toggleTheme, currentTheme } = useContext(ThemeContext);
  console.log(currentTheme.primaryContainer);
  return <OHeader onClick={() => toggleTheme()}>HelloWorld</OHeader>;
};

export default App;

在console.log(currentTheme.something)中,打字机正在工作,但在这样的styledComponent内部却不能工作。

代码语言:javascript
复制
import styled from "styled-components";

export const OHeader = styled.div`
  background-color: ${(props) => props.theme.primary};
`;

它已经开始工作了,但是当我编写props.theme.something时,它不会预测或键入样式组件提供的当前主题中的值。

EN

回答 1

Stack Overflow用户

发布于 2022-05-02 17:18:34

样式组件的提供程序上下文充当单例。因此,当您从库中和消费应用程序中的样式组件导入时,主题上下文不匹配。

若要修复使样式化组件成为库中对等依赖项的问题,请执行以下操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70578845

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档