Skip to content

src/utils/ 里 1,373 行 .js 不受类型检查,而 .js/.ts 的分界线已经名存实亡(并带来一条未声明的 Node ≥22.18 依赖) #48

Description

@SongshGeo

src/utils/ 里 8 个 .js 文件、1,373 行,astro check 一行都没看。而「为什么是
.js 不是 .ts」这个理由,仓库自己已经不遵守了。

事实一:这 1,373 行不受类型检查

tsconfig.json extends astro/tsconfigs/strict,它继承的 base.json 里是
"allowJs": true,而没有 checkJs。所以:

src/utils/contentLayout.js            170   (23 个文件 import 它,全仓被 import 最多)
src/utils/i18nContract.js             387
src/utils/obsidian-links.js           275
src/utils/rehype-callouts.js          147
src/utils/render-markdown.js          137
src/utils/bundleAssets.js             106
src/utils/remark-obsidian-callouts.js  94
src/utils/remark-revive-directives.js  57

eslint.config.js 的注释已经把这件事写下来了,并且说 ESLint 是唯一看得见它们的
工具——但 ESLint 看不出类型。这里面正是它列举的「path resolution、remark AST
surgery、recursive deletes」。

事实二:.js / .ts 的分界线已经失效

原来的理由是「scripts/*.mjs 要不经构建直接 import 它们」,写在
contentLayout.jsi18nContract.js 的文件头。但 scripts/check-content.mjs
现在这么写:

import { normalizeRole, ROLES } from '../src/utils/roles.ts';
import { matchAuthorIds, readPeople } from '../src/utils/peopleIndex.ts';

它已经在直接 import .ts 了。所以「必须是 .js」不再成立,剩下的 8 个 .js
历史,不是规则。现在的状态最坏:既没有统一的规则可讲,又丢掉了类型。

事实三:这条隐式依赖没有被记录,且和声明的 Node 版本不一致

.mjs 直接 import .ts 依赖 Node 的 type stripping。它在 Node 22.6 需要
--experimental-strip-types,到 22.18 才默认开启。而仓库声明的是:

package.json   "engines": { "node": ">=22.0.0" }
.nvmrc         22

在 Node 22.0–22.17 上,npm run check:contentnpm run i18n:manifest 会直接
报错——两个都在 CI 的必经路径上。CI 现在能过,是因为 .nvmrc22 解析到了
新的 22.x。这不是一个可以靠运气维持的约束。

建议

  1. engines.node 收紧到 >=22.18.0.nvmrc 写具体版本。这一步立刻做,
    和下面无关。
  2. 把 8 个 .js 全部转成 .ts。scripts 已经证明它 import 得动。
  3. 转完之后 astro check 自动覆盖它们;不想一次转完的话,中间状态可以先在
    tsconfig.json 打开 "checkJs": true + 逐文件加 // @ts-check,把当前的
    类型错误暴露出来再排期。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debt技术债 / 重构

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions