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.js 和 i18nContract.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:content 和 npm run i18n:manifest 会直接
报错——两个都在 CI 的必经路径上。CI 现在能过,是因为 .nvmrc 的 22 解析到了
新的 22.x。这不是一个可以靠运气维持的约束。
建议
- 把
engines.node 收紧到 >=22.18.0,.nvmrc 写具体版本。这一步立刻做,
和下面无关。
- 把 8 个
.js 全部转成 .ts。scripts 已经证明它 import 得动。
- 转完之后
astro check 自动覆盖它们;不想一次转完的话,中间状态可以先在
tsconfig.json 打开 "checkJs": true + 逐文件加 // @ts-check,把当前的
类型错误暴露出来再排期。
src/utils/里 8 个.js文件、1,373 行,astro check一行都没看。而「为什么是.js 不是 .ts」这个理由,仓库自己已经不遵守了。
事实一:这 1,373 行不受类型检查
tsconfig.jsonextendsastro/tsconfigs/strict,它继承的base.json里是"allowJs": true,而没有checkJs。所以:eslint.config.js的注释已经把这件事写下来了,并且说 ESLint 是唯一看得见它们的工具——但 ESLint 看不出类型。这里面正是它列举的「path resolution、remark AST
surgery、recursive deletes」。
事实二:
.js/.ts的分界线已经失效原来的理由是「
scripts/*.mjs要不经构建直接 import 它们」,写在contentLayout.js和i18nContract.js的文件头。但scripts/check-content.mjs现在这么写:
它已经在直接 import
.ts了。所以「必须是 .js」不再成立,剩下的 8 个.js是历史,不是规则。现在的状态最坏:既没有统一的规则可讲,又丢掉了类型。
事实三:这条隐式依赖没有被记录,且和声明的 Node 版本不一致
.mjs直接 import.ts依赖 Node 的 type stripping。它在 Node 22.6 需要--experimental-strip-types,到 22.18 才默认开启。而仓库声明的是:在 Node 22.0–22.17 上,
npm run check:content和npm run i18n:manifest会直接报错——两个都在 CI 的必经路径上。CI 现在能过,是因为
.nvmrc的22解析到了新的 22.x。这不是一个可以靠运气维持的约束。
建议
engines.node收紧到>=22.18.0,.nvmrc写具体版本。这一步立刻做,和下面无关。
.js全部转成.ts。scripts 已经证明它 import 得动。astro check自动覆盖它们;不想一次转完的话,中间状态可以先在tsconfig.json打开"checkJs": true+ 逐文件加// @ts-check,把当前的类型错误暴露出来再排期。