网站搜索

Blazor 与 TypeScript 的 JS 互操作 - 正确的 DotNet 声明导入


我正在编写一个 Razor 类库,其中包含从 TypeScript 转译而来的 JavaScript 互操作。一些 TypeScript 代码会引用全局可用的变量 DotNet,该变量会在初始化 Blazor 库时被包含。我能够在 @microsoft/dotnet-js-interop Node 包(作为 devDependency 添加)中找到 DotNet 模块声明,并且当在我的 tsconfig.json 中设置 "moduleResolution": "node" 时,TypeScript 能够找到该导出。然而,如果我执行 import { DotNet } from "@microsoft/dotnet-js-interop",那么该导入会保留在转译后的 JavaScript 代码中。我尝试了一些变通方法,但都没有成功:

  1. 使用 import type { DotNet } from "@microsoft/dotnet-js-interop" 会在引用 DotNet 的地方出现 (TS) 'DotNet' 不能作为值使用,因为它是使用 'import type' 导入的。
  2. 我无论如何尝试类似 ///<reference types/path="@microsoft/dotnet-js-interop or node_modules/@microsoft/dotnet-js-interop/dist/Microsoft.JSInterpop.d.ts"> 的方法,或者修改 tsconfig.json 中的 paths(配合 "baseUrl"=".")或 typeRoots 等值,都无法得到任何结果。所有这些方法都会导致错误 (TS) Cannot find name 'DotNet'。

有没有办法正确地导入 DotNet 模块声明,而不在转译后的 JavaScript 代码中造成不必要的导入?

答案#1

这有点棘手(缺乏连贯的文档没有帮助),但我还是能够自己弄明白。

诀窍是声明一个变量,并使用 typeof import 来定义它的类型,如下所示:

declare const DotNet: typeof import("@microsoft/dotnet-js-interop").DotNet;

把这个放在文件的顶部,你就可以开始了。

相关文章