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

如何在TypeScript中获取SCSS变量?求最优实现方案

从SCSS变量取色用于TypeScript元素配置的最优实践

嘿,你的这个实现思路其实已经很靠谱了——借助CSS自定义属性(也就是你在:root里定义的变量),通过浏览器原生API读取这些值再应用到元素配置对象中,这本身就是前端领域里跨CSS和JS共享样式值的标准玩法之一。不过我们可以从代码的可维护性、简洁性上再做些优化,让方案更优雅~

先肯定你的现有实现

你的做法有两个很赞的优点:

  • 遵循了单一数据源原则:所有颜色值都维护在SCSS里,避免了CSS和JS两边硬编码重复值,后续改颜色只需要改一处
  • 兼容性拉满:getComputedStyle是浏览器原生API,支持所有现代浏览器,甚至IE11都能搞定

优化方案建议

1. 封装读取CSS变量的工具函数

把重复的getComputedStyle逻辑抽成一个小函数,避免代码冗余,也让可读性更好:

// 封装成工具函数,复用性拉满
const getRootCssVar = (varName: string): string => {
  // 用trim()去掉变量值前后可能的空格,避免样式异常
  return window.getComputedStyle(document.documentElement)
    .getPropertyValue(varName)
    .trim();
};

// 调用起来就清爽多了
this.normalRate = getRootCssVar("--normal-rate");
this.specialRate = getRootCssVar(RateColor.SpecialRate);
this.flatRate = getRootCssVar(RateColor.FlatRate);

2. 省去中间变量,直接在对象中调用

如果这些颜色值只用来生成obj,完全可以跳过单独定义normalRate这类变量的步骤,直接在创建对象时调用工具函数,减少不必要的变量声明:

const getRootCssVar = (varName: string): string => {
  return window.getComputedStyle(document.documentElement)
    .getPropertyValue(varName)
    .trim();
};

this.obj = [
  { 
    title: '', 
    allDay: false,
    // ...其他属性
    backgroundColor: getRootCssVar(RateColor.SpecialRate), 
    borderColor: getRootCssVar(RateColor.SpecialRate) 
  },
  { 
    title: '', 
    allDay: false,
    // ...其他属性
    backgroundColor: getRootCssVar("--normal-rate"), 
    borderColor: getRootCssVar("--normal-rate") 
  },
  { 
    title: '', 
    allDay: false,
    // ...其他属性
    backgroundColor: getRootCssVar(RateColor.FlatRate), 
    borderColor: getRootCssVar(RateColor.FlatRate) 
  }
];

3. TypeScript类型安全强化

既然用了TS,那可以把CSS变量名做成枚举,避免拼写错误,还能获得编辑器的类型提示:

// 定义枚举,把变量名统一管理
enum RateColor {
  NormalRate = "--normal-rate",
  SpecialRate = "--special-rate",
  FlatRate = "--flat-rate"
}

// 调用时编辑器会自动提示,再也不用担心写错变量名啦
getRootCssVar(RateColor.NormalRate);

补充:另一种方案——CSS Modules(如果项目支持)

如果你的项目已经用上了CSS Modules,也可以直接在TS里导入SCSS变量,不过这种方式需要提前配置SCSS导出变量:

// 在你的SCSS文件里加一段导出代码
:export {
  normalRate: #00008b;
  specialRate: #80d4ff;
  flatRate: #F7941D;
}

然后在TS里直接导入使用:

import styles from './your-styles.module.scss';

this.obj = [
  { 
    // ...其他属性
    backgroundColor: styles.specialRate, 
    borderColor: styles.specialRate 
  },
  // ...其他配置项
];

这种方式的好处是不需要通过浏览器API读取,编译阶段就能拿到值,但缺点是无法响应CSS变量的动态变化——如果运行时修改了:root里的变量值,TS里导入的旧值不会自动更新。而你原来的方法可以实时获取最新的CSS变量值,这是它的核心优势。

最后总结

你的原始实现已经是正确且实用的方案,尤其是需要支持CSS变量动态更新的场景,这种方法就是最优解。上面的优化只是让代码更整洁、更好维护,你可以根据项目的实际情况选适合的方式~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 19:57:28