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);