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 代码中。我尝试了一些变通方法,但都没有成功:
- 使用
import type { DotNet } from "@microsoft/dotnet-js-interop"会在引用DotNet的地方出现(TS) 'DotNet' 不能作为值使用,因为它是使用 'import type' 导入的。 - 我无论如何尝试类似
///<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;
把这个放在文件的顶部,你就可以开始了。
