Demo code in the TypeScript playground
我尝试使用ES6's Proxy
object创建更加动态的装饰器模式实现。
一般的想法是我有一个IService
接口和一个BaseService
抽象类。抽象类具有origin
属性,该属性是IService
的实例,并且所有未实现的调用都被转发到此对象。 BaseService
公开了一个静态方法wrap
,它创建了一个装饰器的新实例,并将其原点设置为作为参数提供的服务实例。
这种方法的功能不是问题,当我尝试指定类型时会出现问题。出于某种原因,当我尝试用MongoService
装饰VerificationService
时,原点类型减少为IService
,返回值的类型为VerificationService & IService
,而不是所需的VerificationService & MongoService
。
我的问题是这是否是预期的行为,因为代码可能导致一些协方差/反差方法问题,或者它是否是一个错误,编译器只是不知道参数的类型是MongoService。请注意,当我尝试装饰一个没有添加任何属性的类的实例时,正确推断出类型(第37行)
答案 0 :(得分:3)
我不是100%确定为什么会发生这种情况,但是如果你看一下wrapper
的类型和VerificationService
的构造函数(继承自BaseService
),我们就会明白为什么这可能是。构造函数的参数是ISerivce
而不是泛型类型,因此最简单的假设是将U
推断为IService
中的wrap
,将第二个参数推断为{{1}满足wrap
所以一切正常,没有理由进一步看。
最简单的解决方案是更改IService
的类型,因为参数可以是任何服务:
wrapper