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

如何让TypeScript编译器识别对象中存在指定函数?

如何让TypeScript识别hasFunction检测后的函数存在?

我想实现一个hasFunction函数,用来检测对象里是否存在指定函数,要求这个函数返回true时,TypeScript编译器能自动知道目标对象有这个函数,不再报错。

我写的初始代码如下:

function hasFunction(obj: any, func: string) {
    if (func in obj && (typeof obj[func] === "function"))
        return true;
    return false;
}

但调用时编译器抛出错误:

function callMyFunc(obj: object) {
    if (hasFunction(obj, "myFunc")) {
        obj.myFunc(); // 错误:Property 'myFunc' does not exist on type 'object'.
    }
}

我尝试过以下写法,但in并非有效的返回类型语法:

function hasFunction(obj: any, func: string): func in obj

请问该如何操作才能让TypeScript编译器识别对象中存在该函数?


解决方案

要实现这个需求,需要使用TypeScript类型谓词(Type Predicate),将hasFunction改造为类型守卫函数,让编译器能根据返回值缩小对象的类型范围。

正确的hasFunction实现

function hasFunction<T extends object, K extends string>(
    obj: T,
    func: K
): obj is T & Record<K, Function> {
    return func in obj && typeof obj[func as keyof T] === "function";
}

调用验证

function callMyFunc(obj: object) {
    if (hasFunction(obj, "myFunc")) {
        obj.myFunc(); // 编译器不再报错
    }
}

关键说明

  • 泛型T约束传入对象的类型,K约束函数名的字符串类型,确保类型安全
  • obj is T & Record<K, Function>是类型谓词,明确告知编译器:当函数返回true时,obj的类型是原类型T与包含K键(值为函数类型)的类型的交集
  • obj[func as keyof T]的类型断言用于让编译器认可func是obj的合法键名

通过这种方式,编译器就能在if分支中正确识别对象包含指定函数属性,消除类型错误。

内容的提问来源于stack exchange,提问作者Cflowe Visit

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 04:55:42