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

如何创建支持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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 23:36:21