我刚用TypeScript启动了一个简单的电子应用程序,我正在尝试设置我的自定义菜单。menu = Menu.buildFromTemplate(template);
无法编译,出现错误:main.ts(109,35): error TS2345: Argument of type '({ label: string; submenu: ({ role: string; } | { type: string; })[]; } | { role: string; submenu...' is not assignable to parameter of type 'MenuItemConstructorOptions[]'.
我一定是遗漏了什么。在任何地方都找不到类型“MenuItemConstructorOptions”(但我可能找错了地方)。我的main.ts完整代码:
import { app, BrowserWindow, screen, Menu } from 'electron';
import * as path from 'path';
let win, menu;
function createWindow() {
const electronScreen = screen;
const size = electronScreen.getPrimaryDisplay().workAreaSize;
win = new BrowserWindow({
x: 0,
y: 0,
width: size.width,
height: size.height
});
// and load the index.html of the app.
win.loadURL('file://' + __dirname + '/index.html');
win.webContents.openDevTools();
win.on('closed', () => {
win = null;
});
}
function createMenu() {
const template = [{
label: 'Edit',
submenu: [
{ role: 'undo' },
{ role: 'redo' },
{ type: 'separator' },
{ role: 'cut' },
{ role: 'copy' },
{ role: 'paste' },
{ role: 'pasteandmatchstyle' },
{ role: 'delete' },
{ role: 'selectall' }
]
},
{
label: 'View',
submenu: [
{ role: 'reload' },
{ role: 'forcereload' },
{ role: 'toggledevtools' },
{ type: 'separator' },
{ role: 'resetzoom' },
{ role: 'zoomin' },
{ role: 'zoomout' },
{ type: 'separator' },
{ role: 'togglefullscreen' }
]
},
{ role: 'window', submenu: [{ role: 'minimize' }, { role: 'close' }] },
{
role: 'help',
submenu: [{
label: 'Learn More',
click() { require('electron').shell.openExternal('https://electron.atom.io');
}
}]
}
];
menu = Menu.buildFromTemplate(template);
Menu.setApplicationMenu(menu);
}
try {
app.on('ready', function() {
createWindow();
createMenu();
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
app.quit();
}
});
app.on('activate', () => {
if (win === null) {
createWindow();
}
});
} catch (e) {
throw e;
}
6条答案
按热度按时间g6ll5ycj1#
对我来说,将模板常量的类型设置为
Electron.MenuItemConstructorOptions[]
就足够了。例如:
gr8qqesn2#
对我来说,问题在于角色的适当资本化:
超过
请参阅docs。
ecfsfe2w3#
我无法在TS的JS中获得工作的示例。
MenuItemConstructorOptions
是在电子包的electron.d.ts
文件中定义的一个接口。然而,我找到了一个解决方案,通过单独定义菜单项并将它们推到一个空数组中。有趣的是,里面的子菜单项被接受并工作,没有任何问题。这是工作的代码:希望这对任何人在同样的问题上绊倒有帮助
ctehm74n4#
当我基于Electron的
Menu
示例编写菜单语法时,我也遇到了同样的错误,它在JavaScript中运行良好,但会扰乱TypeScript。不幸的是,MenuItemConstructorOptions[]
将template
转换为suggested by PhoneixS对我不起作用。在Electron的例子中,TypeScript似乎在三元菜单上绊倒了,它无法计算出它们的结果类型。在我的例子中,在封闭三元菜单的右括号后面添加
as MenuItemConstructorOptions[]
,使TypeScript意识到它们毕竟是有效的子菜单。有效TypeScript中的完整Electron示例:
ipakzgxi5#
在MenuItemConstructorOptions接口中,submenu属性是使用联合类型定义的。因此,需要将该属性强制转换为MenuItemConstructorOptions数组,以便识别推送运算符:
t2a7ltrp6#
您有一个错误/错字我猜在这里:
TypeScript无法解析类型,因为
type
属性未知(根据您的其他输入,应该是role
)