将Electron API方法类型添加到窗口元素,以便在Svelte中进行类型检查

gorkyyrv  于 12个月前  发布在  Electron
关注(0)|答案(1)|浏览(116)

我使用ipcMain从Svelte进行API调用。通常,我会这样做:

const get_version = async () => {
    version = await window.api.GetVersion();
}

字符串
它是这样处理的:

//preload.ts
const WINDOW_API = {
    GetVersion: () => ipcRenderer.invoke("get/version")
}
contextBridge.exposeInMainWorld("api", WINDOW_API);
//main.ts
ipcMain.handleOnce("get/version", () => app.getVersion());

虽然这段代码运行良好,但Typescript给出了以下错误:
属性“API”在类型“Window & typeof globalThis”上不存在. ts(2339)
这个错误出现在.svelte文件中。我试图通过在我的global.d.ts文件中创建一个接口来解决这个问题,如下所示:

//global.d.ts
interface Window {
    api: any;                                   //attempt 1
    api: { GetVersion: () => Promise<string>; } //attempt 2
}


但是两次尝试都失败了,错误仍然存在。我知道我可以使用像(window as any)这样的东西来抑制这个错误,但是随着我的API调用的增长,我相信类型检查会很有帮助,所以我想尝试解决这个问题。
我该怎么解决这个问题?
注1:我相当确定我已经为Svelte文件正确设置了Typescript类型检查,因为我已经使用了自定义类型。

vxf3dgd4

vxf3dgd41#

原来我不得不把接口移到全局声明中,这样Svelte才能接收到它。在修改了我的全局声明类型脚本后,问题就解决了。

declare global {
    interface Window
    {
        api: any;
    }
    //...
}

字符串
然而,奇怪的类型仍然存在。通常情况下,window应该是Window类型,但它是Window & typeof globalThis。我仍然没有弄清楚为什么会这样,我很有兴趣了解到底是什么导致了这一点。

相关问题