From 0395c552138df5f1811e6cbe8b684562a9e9a01d Mon Sep 17 00:00:00 2001 From: xfy Date: Thu, 16 Jul 2026 17:06:06 +0800 Subject: [PATCH] =?UTF-8?q?fix(mermaid):=20=E4=BF=AE=E5=A4=8D=20tsc=20?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - mermaid.ts: initMermaid 早退路径(root 未命中)返回 Promise.resolve() 而非 undefined,匹配 Promise 签名。 - theme-transition.test.ts: resolveAsync 改用 mutable 容器 { fn: null } 包裹, 绕过 TS 跨闭包控制流收窄(原 let + 闭包赋值,在 ?.() 处被判定为 null → never)。 上提交漏跑 tsc --noEmit(vitest 用 esbuild 不做类型检查),本次补验 tsc + vite build。 --- libs/yggdrasil-core/src/mermaid.ts | 2 +- libs/yggdrasil-core/src/theme-transition.test.ts | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/libs/yggdrasil-core/src/mermaid.ts b/libs/yggdrasil-core/src/mermaid.ts index 84438d2..b775e29 100644 --- a/libs/yggdrasil-core/src/mermaid.ts +++ b/libs/yggdrasil-core/src/mermaid.ts @@ -152,7 +152,7 @@ function observeBlock(pre: HTMLPreElement, render: () => Promise): void { */ export function initMermaid(selector: string, theme: ThemeName): Promise { const root = document.querySelector(selector); - if (!root) return; + if (!root) return Promise.resolve(); // 路径 1:未渲染的块( 还在)。 const blocks = root.querySelectorAll('pre > code.language-mermaid'); diff --git a/libs/yggdrasil-core/src/theme-transition.test.ts b/libs/yggdrasil-core/src/theme-transition.test.ts index 76dabb2..53b6382 100644 --- a/libs/yggdrasil-core/src/theme-transition.test.ts +++ b/libs/yggdrasil-core/src/theme-transition.test.ts @@ -210,13 +210,15 @@ describe('startThemeTransition', () => { writable: true, }); - // registry 回调返回一个可控的 Promise,记录它是否在 callback resolve 前完成 - let resolveAsync: (() => void) | null = null; + // registry 回调返回一个可控的 Promise,记录它是否在 callback resolve 前完成。 + // resolveAsync 用 mutable 容器包裹,绕过 TS 跨闭包的控制流收窄(否则在 ?.() 处 + // 被判定为 null → never)。 + const resolveAsync: { fn: (() => void) | null } = { fn: null }; const asyncDone = { value: false }; const off = onThemeChange((isDark) => { void isDark; return new Promise((resolve) => { - resolveAsync = () => { + resolveAsync.fn = () => { asyncDone.value = true; resolve(); }; @@ -230,7 +232,7 @@ describe('startThemeTransition', () => { expect(asyncDone.value).toBe(false); // 触发异步任务完成 - resolveAsync?.(); + resolveAsync.fn?.(); await callbackPromise; expect(asyncDone.value).toBe(true);