如何创建支持apply、get、set的全类型Proxy并规避// @ts-ignore
解决Proxy兼具函数调用与属性访问的TypeScript类型问题
你的核心问题是:普通对象无法满足「既是函数又是带属性的对象」的类型要求,导致必须用// @ts-ignore绕过检查。要解决这个问题,你需要创建一个真正兼具函数身份和属性的目标对象,而非用普通对象字面量冒充。
修正后的代码
interface Target { (value: any): any; hello: () => void; } // 先创建符合调用签名的函数,再添加属性 const target: Target = (value: any) => { // 这里可定义函数调用逻辑,比如返回传入值或其他处理 return value; }; // 给函数添加hello属性 target.hello = () => { console.log("world"); }; const handler: ProxyHandler<Target> = { apply: (target, thisArg, argArray) => { return target.apply(thisArg, argArray); }, get: (target, prop) => { return target[prop as keyof Target]; } }; const typeofProxy = new Proxy(target, handler); // 两种用法均能正常通过类型检查 typeofProxy("anyvalue"); typeofProxy.hello();
关键说明
- 直接用对象字面量
{ hello: ... }无法满足Target接口的函数调用签名要求,TypeScript会判定它不是可调用的函数,因此报错。 - 先定义符合
Target调用签名的函数,再为其添加属性,这样创建的target同时具备函数的可调用性和对象的属性,完全匹配Target类型,无需任何忽略注释。 - 若不需要函数调用有实际逻辑,可让函数返回
undefined或空实现,只要保证签名符合要求即可。
内容的提问来源于stack exchange,提问作者Meslzy
相关产品推荐
相关产品推荐

