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

在Emotion中如何定义受限TS类型,使css prop仅允许指定CSS属性插值

Emotion中实现带属性约束的css prop TypeScript类型定义

Emotion 没有直接对外暴露你描述的这类开箱即用的工具类型,但我们可以基于 Emotion 内置的 CSSObject 类型封装递归工具类型来实现需求,同时保留选择器、媒体查询等嵌套结构的类型支持。

自定义工具类型实现

import type { CSSObject } from '@emotion/react'

// 泛型参数传入你允许使用的CSS属性名集合
type RestrictedCSS<AllowedProps extends keyof CSSObject> = {
  // (string & {}) 为TS黑魔法,既保留允许属性的类型提示,也支持任意自定义选择器字符串
  [Key in AllowedProps | (string & {})]?: 
    Key extends AllowedProps 
      ? CSSObject[Key] 
      // 选择器对应的嵌套值递归应用当前约束类型
      : RestrictedCSS<AllowedProps>
}

使用示例

以仅允许使用color属性为例:

// 声明仅允许color属性的css类型
type OnlyColorCSS = RestrictedCSS<'color'>

// ✅ 合法写法
const validCSS: OnlyColorCSS = {
  color: 'white',
  "&:hover": {
    color: 'black',
  }
}

// ❌ 非法写法,TS会直接报错
const invalidCSS: OnlyColorCSS = {
  color: 'white',
  height: 32, // 报错:height不在允许的属性列表中
  "&:hover": {
    color: 'black',
    border: 2, // 报错:border不在允许的属性列表中
  }
}

如果需要的是排除指定属性、允许其他所有CSS属性的场景,只需要调整工具类型的判断逻辑即可,核心原理是通过递归处理嵌套的选择器结构,避免Pick直接过滤非CSS属性键的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 01:15:07