You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在TypeScript中使用连字符格式的合法CSS属性名类型?

问题:获取TypeScript中连字符格式的CSS属性类型

我在组件中定义了一个接收合法CSS属性数组的props:

interface MyComponentProps {
    cssProperties: (keyof CSSStyleDeclaration)[];
}

const MyComponent = ({ cssProperties }: MyComponentProps) => {
    //
}

问题在于CSSStyleDeclaration存储的样式属性名是驼峰格式,而我需要原始的连字符格式CSS属性,比如background-color而非backgroundColor。我知道React.CSSProperties类型同样使用驼峰格式,只是允许无单位数值。请问是否存在对应原始连字符格式CSS属性名的TypeScript类型?


回答

TypeScript标准库本身没有直接提供连字符格式的CSS属性名类型,但可以通过模板字面量类型自行生成,实现步骤如下:

1. 定义驼峰转连字符的类型转换器

利用TypeScript的模板字面量递归能力,把驼峰字符串转为连字符格式:

type CamelToKebab<S extends string> = S extends `${infer P}${infer R}`
  ? `${P extends Uppercase<P> ? '-' : ''}${Lowercase<P>}${CamelToKebab<R>}`
  : S;

2. 生成连字符格式的CSS属性类型

基于CSSStyleDeclaration的键名,通过转换器生成目标类型:

type KebabCSSProperties = CamelToKebab<keyof CSSStyleDeclaration>;

3. 改造组件Props

将原props的类型替换为生成的连字符属性类型:

interface MyComponentProps {
    cssProperties: KebabCSSProperties[];
}

const MyComponent = ({ cssProperties }: MyComponentProps) => {
    // 示例使用:遍历连字符格式的属性名
    cssProperties.forEach(prop => {
        console.log(prop); // 输出如 "background-color" "border-top-left-radius"
    });
}

可选优化:过滤非标准属性

CSSStyleDeclaration包含一些非CSS属性的键(如length、parentRule),可以用Exclude过滤掉:

type KebabCSSProperties = Exclude<CamelToKebab<keyof CSSStyleDeclaration>, 'length' | 'parentRule'>;

内容的提问来源于stack exchange,提问作者Robo Robok

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 18:01:25