Electron preload.ts 类型无法自动推导的解决方案

Electron preload.ts 类型无法自动推导的解决方案

在 Electron 中通过 contextBridge.exposeInMainWorld() 暴露 API:

javascript 复制代码
// preload.ts
import { contextBridge, ipcRenderer } from 'electron';

contextBridge.exposeInMainWorld('electron', {
  puppeteer: () => ipcRenderer.invoke('puppeteer'),
  db: () => ipcRenderer.invoke('db'),
});

Renderer 中调用:

javascript 复制代码
await window.electron.puppeteer();

TypeScript 会报错:

rust 复制代码
Property 'electron' does not exist on type 'Window & typeof globalThis'

原因是:

contextBridge.exposeInMainWorld() 只是在运行时向 window 注入对象,TypeScript 并不会根据 preload.ts 自动推导出:

javascript 复制代码
window.electron

的类型。

因此需要手动定义类型声明,并让 preload.ts 和 Renderer 共用同一套类型。

1. 定义 Electron API 类型

创建:

bash 复制代码
src/types/electron.ts
typescript 复制代码
export interface ElectronAPI {
  puppeteer(): Promise<void>;
  db(): Promise<unknown>;
}

以后所有暴露给 Renderer 的 Electron API,都统一维护在这里。

2. preload.ts 使用同一个类型

typescript 复制代码
import { contextBridge, ipcRenderer } from 'electron';
import type { ElectronAPI } from './types/electron';

const electronAPI: ElectronAPI = {
  puppeteer: () => ipcRenderer.invoke('puppeteer'),
  db: () => ipcRenderer.invoke('db'),
};

contextBridge.exposeInMainWorld('electron', electronAPI);

这样 preload.ts 本身也会受到 TypeScript 类型检查。

例如 ElectronAPI 中声明了:

javascript 复制代码
puppeteer(): Promise<void>;

electronAPI 中漏掉了这个方法,TypeScript 会直接提示错误。

这样可以避免接口类型和实际 preload 实现不一致。

3. 给 window.electron 增加全局类型

创建:

bash 复制代码
src/types/global.d.ts
typescript 复制代码
import type { ElectronAPI } from './electron';

declare global {
  interface Window {
    electron: ElectronAPI;
  }
}

export {};

之后 Renderer 中就可以直接使用:

javascript 复制代码
await window.electron.puppeteer();

const result = await window.electron.db();

同时也会有完整的 IDE 自动补全和 TypeScript 类型检查。

相关推荐
名字还没想好☜28 分钟前
kubectl 排障实战:jsonpath 精准取值、custom-columns、events 排序与 top 速查
运维·前端·chrome·docker·kubernetes
李昊哲小课34 分钟前
Spring Boot 4 旅游主题实战教程 阶段二:Web 开发基础
前端·spring boot·旅游
ITmaster07311 小时前
从零到一!前端搭建本地轻量化 RAG 问答系统
前端
夏炳辉.1 小时前
Flex布局中 flex: 1 的完整解析与实战指南
前端·css·css3
CIO_Alliance2 小时前
AI提示系列(2)| Few-shot与ReAct有何不同? 大模型工具调用的底层逻辑详解
前端·人工智能·深度学习·神经网络·react.js·前端框架·ai+ipaas
cindershade2 小时前
别只收三个数字:前端 RUM 如何建立可解释的体验数据链
前端
前端 贾公子2 小时前
第09章:上下文与记忆 (4)
java·服务器·前端
Coodor3 小时前
使用web也可以写NFC微信小程序拉取
前端·微信小程序·小程序·nfc拉起小程序