Chai如何实现带参数的调用括号可选?TypeScript适配方案咨询
实现兼具Getter与可调用方法的同名属性(TypeScript环境)
问题背景
有两个看似相关的问题,但和我的实际需求不完全匹配:
- 第一个是探究Chai JS如何实现函数括号可选,但该场景要求必须省略括号,和我需要「两种写法都支持」的目标不符
- 第二个是实现函数调用括号可选,但方案未用到
Object.defineProperty,也不符合我的场景
实际需求
我需要实现:同一名称同时对应getter和方法,或者说实现可通过添加括号传入参数的getter。同时我正在使用TypeScript,要求无论采用何种方案,都不能导致类型定义出现异常。
举Chai库的例子,以下两种写法均合法:
expect(foo).to.be.undefinedexpect(foo).to.be.undefined('some message')
尝试代码及运行问题
我尝试了如下代码:
let foo = Object.defineProperty( { test: (f: string = 'get') => console.log(f) }, 'test', { get: () => console.log('get') } ); foo.test foo.test('value')
这段代码在VS Code中智能提示正常,但运行时会报错:调用foo.test时getter会被触发两次,第二次还会抛出「test不是函数」的错误(运行报错截图:
)
源码研究困境
我研究过Chai的源码,虽然它大量使用Object.defineProperty,但始终无法定位到实现这种「属性直接访问+带参数调用」双写法的具体逻辑。
内容的提问来源于stack exchange,提问作者user3534080
相关产品推荐
相关产品推荐

