typescript接口中的“构造函数”

我从正在使用的库中收到以下界面:

导出接口板条{
建造商(lat:编号,lng:编号):无效;
lat():编号;
lng():编号;
}

如何创建此类的实现?(我需要一个测试模拟)一个外观自然的实现,构造函数定义为:

导出类LatLngImpl实现LatLng{
构造函数(private _lat:number,private _lng:number){}

不编译:

类“LatLngImpl”不正确地实现了接口“LatLng”。
属性“构造函数”的类型不兼容。
类型“功能”不可分配给类型“(纬度:编号,液化天然气:编号)=>>void”。
类型“Function”不提供与签名匹配的内容(lat:number,lng:>number):void’

我在typescript中读到了constructor接口,但我认为它在这里不适用

编辑:

我不理解的是接口中的constructor()声明。具有构造函数签名的接口使用new()语法

这个库是从哪里来的?编写它的人应该受到严厉的批评。要么是错误(在这种情况下,他们从未测试过它),要么是故意的,但很卑鄙:使用不完全保留的单词构造函数作为实例方法的标识符只是自找麻烦

编辑2019-04-25:问题不仅仅是“这是个坏主意”;事实上,一旦JavaScript本机支持类字段,使用名为“constructor”的属性的类将是一个错误.TypeScript将在3.5+版本中更改以反映这一点,因此下面的实现将停止工作。有关详细信息,请参阅最近打开的GitHub发行版Microsoft/TypeScript#31020。在TS3.5之后,似乎无法使类具有非实际构造函数的实例构造函数属性r函数本身

要么库作者打算引用您使用new调用的真实构造函数,在这种情况下,他们应该执行类似@Series0ne的建议;要么作者确实想使用实例方法初始化对象,在这种情况下,他们应该帮每个人的忙,使用更传统的方法名称比如init()

在任何一种情况下,都不应该有人接受您提供的接口,当然也不应该有人实现它

让我们实施它:

导出类LatLngImpl实现LatLng{
私人_lat:编号;
私人液化天然气:编号;
lat(){
把这个还给我;
}
液化天然气(){
归还这个;
}
//这里是重要的部分,但请参见Microsoft/TypeScript#31020
“建造商”(lat:编号,lng:编号){
这个。_lat=lat;
本标准为液化天然气=液化天然气;
}
}

诀窍是使用字符串literal“constructor”而不是裸词constructor

字符串文字可用于提供无效标识符的属性名称

通过使用字符串文字,我们能够将其声明为实例方法,而不是在调用new时调用的静态类构造函数方法,并且它可以顺利编译

现在我们可以使用它,如果我们敢:

const latLng=new LatLngImpl();
建造商(47.6391132,-122.1284311);//😠 为什么不使用init()?
log(“纬度:+latLng.lat()+”,经度:+latLng.lng());

哎呀,我们不该这么做

重新编辑2019-04-25从TypeScript 3.5开始,上面引用的字符串实现将无法工作,对此的正确答案将是“您不能这样做”和“使用真正的构造函数”

希望有帮助,祝你好运

发表评论