在创建图标组件时,我们希望将与颜色相关的属性作为道具添加到 className 中。
图标是由 SVG 组成的,与其手动指定填充和描边值,我希望使用 Tailwind CSS 的自动完成功能来为 className 着色。
例如,我想编写以下代码
接口 IconProps {
fill: string;
stroke: string;
}
const Icon = ({fill, stroke}: IconProps) => {
<svg className={`${fill} ${stroke}`} />
}
为了利用 tailwind 的自动完成功能,我们需要赋予fill
和stroke
不同的类型,而不是字符串
,也就是说,我们需要获取在 tailwind 中设置的颜色类名称。
提取类型
首先,我们可以从 tailwind 中获取默认颜色信息
从 "tailwindcss/colours "导入 defaultColors;
导出类型 DefaultColors = keyof typeof defaultColors;
const color: DefaultColors = "blue
但是,只有颜色键会自动完成,后面没有提供属性。(蓝色
会自动完成,但不是blue-500
,等等)。
接下来,让我们导入 tailwind 的完整配置
import resolveConfig from "tailwindcss/resolveConfig";
import tailwindConfig from "web/tailwind.config.ts"; // tailwind 配置文件
const fullConfig = resolveConfig(tailwindConfig);
我们可以从fullConfig
获取以下信息
让我们结合上述信息创建一个名为 ColorShade
的新类型
type ColourShade<T extends DefaultColours> = keyof ColourConfig[T] extends
| 字符串
| 数字
* keyof ColourConfig[T] extends | string | number
: never;
const shade: ColourShade<'blue'> = '500'
现在,我们还可以获取颜色之后的属性。
结合起来,我们可以提取出一个结合了颜色和亮度的名称。
类型 TailwindColourClass = {
[P in DefaultColours]:ColorShade<P> extends never ? P :`${P}-${ColourShade<P>}`;
}[DefaultColours];
应用
现在,让我们为 fill 创建一个可以在 fill 中使用的 className,为 stroke 创建一个只能在 stroke 中使用的 className,这正是我想要的。
接口 IconProps {
fill:`fill-${TailwindColourClass}`;
stroke:`storke-${TailwindColourClass}`;
}
应用自定义颜色
上述代码的问题在于,它只导入了 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 Colors;
type ColorConfig = typeof colorTheme;
type ColorKeys = keyof Colors;
type 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}`;
}