scss 中 _is-length 等类型校验函数可提前拦截无单位数值、字符串伪装数值等静默错误:_is-length(16) 返回 false,_is-number("10px") 返回 true(易误判),需组合 type-of($val) == number 才安全;_is-color 拒绝字符串和 css 变量,且所有校验必须显式用 @if 触发。

因为 SCSS 编译期不报错,_is-length 这类函数能提前拦截无单位数值、字符串伪装的数值等导致样式失效的“静默错误”。
无单位数值在 SCSS 里不会报错,但浏览器直接忽略
比如写 margin: $spacing;,而 $spacing: 16; —— 编译后是 margin: 16;,CSS 语法合法,但浏览器无视该声明,布局就塌了。开发者工具里也只显示“无效值”,没源头提示。
-
_is-length($spacing)返回false,你就能在@if里拦住它,改用16px或var(--spacing) - 它接受
calc(1rem + 4px)、var(--gap)、auto,但拒绝16(unitless)、"16px"(字符串) - 别指望编译器替你判断:Dart Sass 默认不校验变量类型,只做文本拼接
_is-number 不等于“是数值”,容易误判字符串
_is-number("10px") 返回 true,因为它只是查字符串里有没有数字字符——这恰恰是陷阱所在。如果你直接用它控制 width,就会输出 width: "10px";,CSS 语法错误。
- 安全组合写法:
@if _is-number($val) and type-of($val) == number -
type-of("10px")是string,type-of(10px)才是number - 单独用
_is-number只适合粗筛,比如判断某个变量能否当透明度基数(opacity: $val要求是 0–1 的 number)
颜色值传错会导致计算崩溃,_is-color 拦在编译前
写 $c: "red"; $lighter: lighten($c, 20%);,编译直接失败:Undefined operation: "red" * 0.8。这不是运行时问题,是编译期类型错配。
-
_is-color(#3b82f6)→true,_is-color("red")→false,_is-color("currentColor")→true - 它不认 CSS 变量:
_is-color(var(--primary))永远false,因为编译期无法解析运行时值 - 关键字如
red必须加引号才成字符串,但字符串不是 color 类型;十六进制如"#fff"同理,必须写成#fff(无引号)
真正容易被忽略的是:这些验证函数不自动生效,必须显式用 @if 包裹并自己决定 fallback 行为;Bourbon 的 validator 全是纯布尔返回,没有默认兜底或警告机制。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











