Skip to content

@sheng/prefer-inline-single-use-map ​

提示只被索引读取一次的对象 / 数组映射表直接内联到使用处。

所属 config ​

  • type-readability:TypeScript 运行时值、映射表和轻量 computed 的可读性约定。

提醒只被索引读取一次的对象 / 数组字面量映射表直接内联到使用处。

这条规则只做提醒,不做 autofix。原因是映射表里可能有注释、satisfies 类型约束或比较复杂的格式,自动改写容易损坏可读性;真正需要保留独立命名时,可以补第二个真实调用方,或在局部用 ESLint disable 写清原因。

独立命名会给读者一个暗示:这张表可能是共享边界,或者后续还会被别处复用。如果映射表只被索引读取一次,维护者还要跳到声明处确认它其实没有复用语义。内联到使用处能让“key 如何得到 value”留在同一个阅读位置。

触发场景 ​

ts
const iconSrcByType = {
  coin: coinSrc,
  diamond: pointsSrc,
} satisfies Record<CurrencyType, string>

const iconSrc = computed(() => iconSrcByType[type.value])

建议写成:

ts
const iconSrc = computed(
  () =>
    (
      ({
        coin: coinSrc,
        diamond: pointsSrc,
      }) satisfies Record<CurrencyType, string>
    )[type.value],
)

不触发场景 ​

同一张表被多处读取时,独立命名能表达共享边界,继续保留:

ts
const iconSrcByType = {
  coin: coinSrc,
  diamond: pointsSrc,
}

const headerIconSrc = computed(() => iconSrcByType[headerType.value])
const footerIconSrc = computed(() => iconSrcByType[footerType.value])

对象只是状态拷贝、参数对象或直接传给函数时,不属于“单次索引映射”:

ts
const nextMap = { ...remarksByUid.value }
nextMap[uid] = remark

const payload = { uid, remark }
await updateRemark(payload)

Vue template 里只读一次的映射表也不强制内联,因为在模板里塞对象字面量通常会降低可读性。

保留独立命名的情况 ​

如果映射表承担文档作用、带有关键注释、被多处读取,或会在测试里单独验证,独立命名仍然合理。规则命中后不必机械内联;真正的判断是“这个名字是否表达了一个真实复用边界”。

相关阅读 ​

这条规则的方法论背景见中文文章 Skill 管不住代码风格时:把项目约定写成 ESLint 护栏。具体触发条件、示例、配置和维护入口以本页为准。

在线试一下 ​

接入方式 ​

@sheng/eslint-plugin 的内置 config 会以 warn 开启这条规则。需要单独配置时,可以这样写:

js
import sheng from '@sheng/eslint-plugin'

export default [
  {
    plugins: {
      '@sheng': sheng,
    },
    rules: {
      '@sheng/prefer-inline-single-use-map': 'warn',
    },
  },
]

选项 ​

当前没有 options。

维护入口 ​

  • 规则源码:src/rules/prefer-inline-single-use-map/index.mjs
  • 规则短说明:src/rules/prefer-inline-single-use-map/README.md
  • 测试用例:tests/unit/architecture/

基于 MIT 协议发布。