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

SASS中实现跨映射取值的自定义函数遇类型错误问题

解决SASS中通过映射指针获取对应配置值的问题

问题核心

你定义了Setup层的两个映射$FontSize、$LineHeight,以及Typography层的$body-attributes(键对应Setup层的映射名),想写一个pointerResolver函数,输入Typography映射和属性名,返回对应Setup映射的取值(比如输入$body-attributes和"LineHeight"时返回1.5)。但用字符串拼接生成变量名的方式报错$map: $LineHeight is not a map.,原因是SASS不支持直接将字符串作为变量名引用,string.unquote("$" + $attributeToSearch)得到的只是字符串,不是真正的映射变量。

正确实现方案

SASS虽然没有动态变量,但可以把所有Setup层的映射统一放到一个父映射里,通过键来访问对应的子映射,这样就能实现需求。

修改后的完整代码

@use "sass:map";

// 把Setup层的映射统一放到父映射中
$SetupMaps: (
  "FontSize": (
    "xs": 0.75rem,
    "sm": 0.875rem,
    "md": 1rem,
  ),
  "LineHeight": (
    "sm": 1.3,
    "md": 1.5,
  )
);

$body-attributes: ( 
  "FontSize": xs,
  "LineHeight": md,
);

@function pointerResolver($typographyMap, $attributeName){
  // 1. 从Typography映射中获取对应子键
  $subKey: map.get($typographyMap, $attributeName);
  // 2. 从父映射中拿到对应的Setup子映射
  $targetMap: map.get($SetupMaps, $attributeName);
  // 3. 返回子映射中对应的值
  @return map.get($targetMap, $subKey);
}

// 测试:返回1.5
@debug pointerResolver($body-attributes, "LineHeight");
// 测试:返回1rem
@debug pointerResolver($body-attributes, "FontSize");

关键说明

  • 把分散的Setup映射整合到$SetupMaps父映射中,用属性名作为键,这样可以通过map.get($SetupMaps, $attributeName)直接拿到对应的子映射,避免了动态变量的问题。
  • 函数逻辑分三步:先取Typography里的子键,再取对应的Setup子映射,最后取子映射里的具体值,逻辑清晰且符合SASS的语法规则。

为什么原来的方法不行?

SASS是预编译语言,变量在编译时就已经确定,无法在运行时通过字符串动态引用变量。string.unquote("$LineHeight")得到的是字符串"$LineHeight",而不是指向$LineHeight映射的引用,所以map.get会把它当成非映射类型,抛出错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 16:20:58