在尾风 CSS 中获取颜色属性

🌐

本帖由 DeepL 翻译。如有任何翻译错误,请告知我们!

在创建图标组件时,我们希望将与颜色相关的属性作为道具添加到 className 中。

图标是由 SVG 组成的,与其手动指定填充和描边值,我希望使用 Tailwind CSS 的自动完成功能来为 className 着色。

例如,我想编写以下代码

接口 IconProps {
  fill: stringstroke: string;
}
const Icon = ({fill, stroke}: IconProps) => {
  <svg className={`${fill} ${stroke}`} />
}

为了利用 tailwind 的自动完成功能,我们需要赋予fillstroke不同的类型,而不是字符串,也就是说,我们需要获取在 tailwind 中设置的颜色类名称。

提取类型

首先,我们可以从 tailwind 中获取默认颜色信息

"tailwindcss/colours "导入 defaultColors;
导出类型 DefaultColors = keyof typeof defaultColors;

const color: DefaultColors = "blue

Image.png

但是,只有颜色键会自动完成,后面没有提供属性。(蓝色会自动完成,但不是blue-500,等等)。

接下来,让我们导入 tailwind 的完整配置

import resolveConfig from "tailwindcss/resolveConfig"import tailwindConfig from "web/tailwind.config.ts"; // tailwind 配置文件

const fullConfig = resolveConfig(tailwindConfig);

我们可以从fullConfig获取以下信息

Image.png

让我们结合上述信息创建一个名为 ColorShade的新类型

type ColourShade<T extends DefaultColours> = keyof ColourConfig[T] extends
  | 字符串
  | 数字
  * keyof ColourConfig[T] extends | string | number
  : neverconst shade: ColourShade<'blue'> = '500'

Image.png

现在,我们还可以获取颜色之后的属性。

结合起来,我们可以提取出一个结合了颜色和亮度的名称。

类型 TailwindColourClass = {
  [P in DefaultColours]:ColorShade<P> extends never ? P :`${P}-${ColourShade<P>}`;
}[DefaultColours];

Image.png

应用

现在,让我们为 fill 创建一个可以在 fill 中使用的 className,为 stroke 创建一个只能在 stroke 中使用的 className,这正是我想要的。

接口 IconProps {
  fill:`fill-${TailwindColourClass}`;
  stroke:`storke-${TailwindColourClass}`;
}

Image.png

应用自定义颜色

上述代码的问题在于,它只导入了 tailwind 的默认颜色,而没有导入自定义颜色。

分离自定义颜色

首先,让我们将自定义颜色分离到一个变量中。

const color = {
  ... formalColours、
  ...keyColours、
  ... 重点颜色
  ...grayColour、
  ...主题颜色
}

让我们创建以下类型来代替上面使用的DefaultColors

type CustomColors = typeof color;
type DefaultColors = typeof defaultColors;
导出类型 Colors = CustomColors & DefaultColors

最终代码

tailwin.config.ts

类型 CustomColors = typeof color;
导出类型 DefaultColours = typeof defaultColours;
导出类型 Colors = CustomColors & DefaultColors

组件.tsx

const fullConfig = resolveConfig(tailwindConfig);
const colorTheme = fullConfig.theme.colors as Colorstype ColorConfig = typeof colorTheme;
type ColorKeys = keyof Colorstype ColorShade<T extends ColourKeys> = keyof ColourConfig[T] extends
  | 字符串
  | 字符串
  | | 数字
  : never;


类型 TailwindColourClass = {
  [P in ColourKeys]:ColorShade<P> extends never ?`${P}-${ColourShade<P>}`;
}[ColourKeys];



接口 IconProps {
  fill:`fill-${TailwindColourClass}`;
  stroke:`storke-${TailwindColourClass}`;
}