eslint

这是个代码风格统一的问题,不是语法对错。你们项目用的是 @antfu/eslint-config(Anthony Fu 的配置),它默认要求:模块顶层导出的函数用 function 声明,箭头函数留给回调和局部场景。

为什么 ESLint 要区分两种写法?

核心目的就三个:

  1. 风格统一 --- 全项目一种写法,读代码不用猜「这里为什么用箭头、那里为什么用 function」
  2. 可读性 --- 顶层 export function encrypt() 一眼能看出是模块对外 API;const encrypt = () => {} 更像变量赋值
  3. 减少无意义的差异 --- 两种写法在顶层功能上几乎一样,团队约定一种,避免 PR 里来回改风格

Antfu 的配置哲学是:顶层用 function,箭头函数留给它真正擅长的场景。

什么时候用 function

模块顶层(文件最外层、要 export 的函数):

// ✅ 你们项目的写法

export function encrypt(txt: string) { ... }

export function useProjectList() { ... }

function generateRandomString() { ... } // 文件内私有辅助函数

你们项目里 authApi.tsprojectApi.tscrypto.tsuseProjectList.ts 都是这个模式。

函数/composable 内部的具名函数(Antfu 也倾向用 function):

javascript 复制代码
export function useProjectList() {
  async function fetchList() { ... }   // ✅
  function handleSearch() { ... }      // ✅
}

什么时候用 const xxx = () => {}() => {}

箭头函数更适合这些场景:

1. 回调(最常见)

javascript 复制代码
list.map((item) => item.id)
list.filter(item => item.active)
button.addEventListener('click', () => { ... })

你们项目里就有:

typescript 复制代码
  return raw.map((item) => {
    const row = item as Record<string, unknown>
    // ...
  }).filter(item => Number.isFinite(item.id))

2. 需要保留外层 this

ini 复制代码
// 类或 Options API 里
someObj.onClick = () => {
  this.value = 1  // 箭头函数继承外层的 this
}

3. 单行、临时、不需要名字的函数

scss 复制代码
const double = (n: number) => n * 2
setTimeout(() => doSomething(), 1000)

4. 需要把函数当值传递、且不想提升(hoist)时

javascript 复制代码
const handlers = {
  click: () => { ... },
  submit: () => { ... },
}

快速对照

场景 推荐写法
模块顶层 export 的函数 export function foo() {}
文件内顶层辅助函数 function helper() {}
composable 内部的具名方法 function fetchList() {}
.map / .filter / 事件回调 () => {}
需要固定 this () => {}
对象字面量里的方法(看团队约定) 两种都有人用,你们项目顶层偏 function

总结

ESLint 不是在说「箭头函数不好」,而是在说:顶层导出的函数请用 function,别用 const xxx = () => {}

const xxx = () => {} 依然很好用,只是更适合回调、闭包、需要 lexical this、匿名小函数这类场景,而不是模块的主要 API 定义。

如果不想遵守这条规则,可以在 eslint.config.js 里关掉 antfu/top-level-function(或对应规则),但和你们现有代码风格会不一致。

相关推荐
ModyQyW32 分钟前
vite-plugin-uni-manifest 更新了什么
前端·typescript·uni-app
ZGIAI1 小时前
旧模型下线前,客服 Agent 怎么迁移
人工智能·架构
ZGIAI1 小时前
客服知识库更新后,怎么批量验收
人工智能·架构
Asize2 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen3 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师4 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马4 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒4 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚4 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲4 小时前
python中的类型标注
前端