TypeScript动态使用Parameters获取Electron Dialog参数时报错求助
问题分析与解决方案
错误原因
你遇到的两个错误本质是同一个问题:Electron.Dialog类型里并非所有属性都是函数,而你定义的U是keyof Electron.Dialog(即Dialog的所有键),当U指向Dialog里的非函数成员时,Parameters<Electron.Dialog[U]>就会失效——因为Parameters工具类型只能作用于函数类型。
手动指定'showOpenDialog'没问题,是因为这个键对应的确实是Dialog的函数方法。
修正方案
需要缩小U的范围,只允许它指向Dialog中值为函数的键,同时确保Parameters只作用于函数类型。下面提供两种可行写法:
写法一:内联条件类型过滤
declare global { interface Window { dialogOpen: <T, U extends keyof Electron.Dialog>( name: U, ...options: Electron.Dialog[U] extends (...args: infer P) => any ? P : never ) => Promise<T>; } }
写法二:预先定义函数键类型
先提取Dialog中所有函数属性的键,再约束U的范围,逻辑更清晰:
// 提取Electron.Dialog中所有值为函数的键 type DialogFunctionKeys = { [K in keyof Electron.Dialog]: Electron.Dialog[K] extends (...args: any) => any ? K : never }[keyof Electron.Dialog]; declare global { interface Window { dialogOpen: <T, U extends DialogFunctionKeys>( name: U, ...options: Parameters<Electron.Dialog[U]> ) => Promise<T>; } }
内容的提问来源于stack exchange,提问作者Get Off My Lawn
相关产品推荐
相关产品推荐

