如何让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
相关产品推荐
相关产品推荐

