回归泛型类型推断

时间:2018-02-28 10:37:35

标签: typescript generics type-inference

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行)

1 个答案:

答案 0 :(得分:3)

我不是100%确定为什么会发生这种情况,但是如果你看一下wrapper的类型和VerificationService的构造函数(继承自BaseService),我们就会明白为什么这可能是。构造函数的参数是ISerivce而不是泛型类型,因此最简单的假设是将U推断为IService中的wrap,将第二个参数推断为{{1}满足wrap所以一切正常,没有理由进一步看。

最简单的解决方案是更改IService的类型,因为参数可以是任何服务:

wrapper