You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Electron-TypeScript中如何复用函数JSDoc至重声明函数?

解决Electron-TS中IPC暴露函数的JSDoc复用问题

要实现JSDoc的单一数据源,无需重复粘贴注释,可以通过TypeScript类型复用让重声明的函数自动继承原函数的文档注释,具体有两种常用方案:

方案1:利用typeof提取原函数类型

直接提取原函数的类型,让preload中的重声明函数复用该类型,TypeScript会自动保留原函数的JSDoc注释。

步骤1:在dbinteract.ts中导出函数和其类型

/** 
 * Adds a new user to the database.
 * @param {AddUserProps} userinfo An object containing all user info besides `id`.
 * @returns The new UserData object from database, including `id`.
 * */
export function addUser(userinfo: AddUserProps) { 
  // ...函数实现
}

// 导出函数类型,自动继承原函数的JSDoc
export type AddUserFn = typeof addUser;

步骤2:在preload.ts中复用该类型

import type { AddUserFn } from './dbfunc/dbinteract';
const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('dbfunc', {
    // 通过类型断言让重声明的函数继承原类型的JSDoc
    addUser: ((userinfo) => ipcRenderer.invoke('db:addUser', userinfo)) as AddUserFn,
});

方案2:定义统一的API接口

把数据库操作的函数签名和JSDoc写在一个接口里,所有实现(包括原函数和IPC桥函数)都遵循这个接口,实现注释的统一管理。

步骤1:在dbinteract.ts中定义接口并实现

/** 
 * Adds a new user to the database.
 * @param userinfo An object containing all user info besides `id`.
 * @returns The new UserData object from database, including `id`.
 * */
export interface DBFunctions {
  addUser: (userinfo: AddUserProps) => Promise<UserData>;
}

// 实现接口,自动继承接口的JSDoc
export const dbinteract: DBFunctions = {
  addUser(userinfo) {
    // ...函数实现
  }
};

步骤2:主进程中使用接口类型

import { app, ipcMain } from 'electron';
import { dbinteract, type DBFunctions } from './dbfunc/dbinteract';

app.on('ready', () => {
  ipcMain.handle('db:addUser', (event, userinfo) => dbinteract.addUser(userinfo));
});

步骤3:preload.ts中复用接口定义暴露对象

import type { DBFunctions } from './dbfunc/dbinteract';
const { contextBridge, ipcRenderer } = require('electron');

// 定义符合接口的对象,自动继承JSDoc
const exposedDbFunc: DBFunctions = {
  addUser: (userinfo) => ipcRenderer.invoke('db:addUser', userinfo),
};

contextBridge.exposeInMainWorld('dbfunc', exposedDbFunc);

补充:让渲染器也能获取JSDoc

如果渲染器使用TypeScript,需要在全局类型声明中定义window.dbfunc的类型,这样在渲染器中调用时也能看到注释:

创建src/types/global.d.ts文件:

import type { DBFunctions } from '../dbfunc/dbinteract';

declare global {
  interface Window {
    dbfunc: DBFunctions;
  }
}

这样无论在preload还是渲染器中,调用dbfunc.addUser时都能自动显示原JSDoc注释,完全实现单一数据源,无需重复编写注释。

内容的提问来源于stack exchange,提问作者Josh Silveous

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 16:27:49