可以在TypeScript中重新声明函数时重用函数的JSDoc吗?

h22fl7wq  于 2023-03-19  发布在  TypeScript
关注(0)|答案(1)|浏览(161)

这是相当挑剔的,但我真的很好奇是否有一些方法可以在TypeScript中做到这一点。
我在Electron-TypeScript项目中有一个函数addUser()。这个函数存在于一个单独的文件中,它导入到main进程中。然后,main进程将这个函数公开给IPC桥,IPC桥允许我在preload中访问它,然后将它公开给渲染器。如下所示:

数据库交互.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`.
 * */
function addUser(userinfo: AddUserProps) { ...code... }

索引.ts(主要)

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

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

预载.ts

const { contextBridge, ipcRenderer } = require('electron')

contextBridge.exposeInMainWorld('dbfunc', {
    addUser: (userinfo: AddUserProps) => ipcRenderer.invoke('db:addUser', userinfo),
});

请注意dbinteract.ts中函数声明上方的JSDoc。请参见,由于IPC桥的性质,我必须在preload.ts中重新声明addUser函数。由于它是重新声明的,因此在preload/renderer中使用重新声明的函数时,我会丢失JSDoc文档。
TypeScript中是否有任何方法可以将JSDoc文档与函数声明分开,以便在使用函数时可以使用该文档,而无需复制/粘贴它?我希望JSDoc有一个单一的真实来源,以某种方式适用于两者。

gmxoilav

gmxoilav1#

我有一个类似的用例,虽然不是专门针对电子的。
我只是Assert重新声明的函数的类型,就好像它是原始函数本身一样,所以在您的情况下,它可能是这样的:

import type { addUser } from "./path/to/dbinteract";

contextBridge.exposeInMainWorld('dbfunc', {
    addUser: ((userinfo: AddUserProps) => ipcRenderer.invoke('db:addUser', userinfo)) as typeof addUser,
});

关键是重新声明的版本必须具有 * 完全相同的签名 *。
注意,这样的远程调用很可能是异步的,所以为了保持一致性,addUser函数也必须是异步的/返回一个Promise。在某些情况下,我必须将我的函数声明为async,即使它的代码完全是同步的......

相关问题