一个前同事写了一小段JavaScript(我什至不知道该怎么称呼。类?库?),现在我正尝试在我们的应用程序的TypeScript部分中使用它。我们有一些类似的情况,我们只向d.ts文件添加了某种声明。我现在正在尝试执行此操作,但是我很想知道我要使用的对象也是原始JS中的一个函数。也就是说,它是通过new
运算符创建的,但是构造的对象具有方法。我希望有人可以告诉我最好的方法。
这是原始的JavaScript类/库:
(function (geographies, $) {
geographies.map = function(elementId) {
var self = this;
// Other members elided
// Public Functions
self.findAddress = function (addressDesc, callback){
// elided
}
// Other public methods elided
// Private Methods
function _example() {
// elided
}
// Other private methods elided
}
}(window.geographies = window.geographies || {}, jQuery));
当然,这导致在全局窗口名称空间中创建geographies
,并且geographies
具有成员map
,该成员具有方法,但是是通过new
创建的带有传入的字符串参数。这是在现有代码中使用的geographies.map
的示例(在这种情况下,self
仅指包含组件):
if ((self.editAddress.cityId() && self.editAddress.addressLine1())) {
if (map === null) {
map = new geographies.map("addressMapDiv");
}
self.mapVisible(true);
var query = (self.editAddress.addressLine1() ? self.editAddress.addressLine1() : "") +
(self.editAddress.cityDescription() ? " " + self.editAddress.cityDescription() : "") +
(self.editAddress.zipCode() ? " " + self.editAddress.zipCode() : "");
console.log(query);
map.findAddress(query);
}
现在,我们开始在TypeScript中使用geographies
,因此想要某种方式来获取Intellisense并对其进行类型检查,但是没有重新实现它的计划。我们只希望TypeScript给我们一种使用窗口命名空间中已经存在的相同对象的方式。我已经采取了一些措施,但似乎都没有道理。我认为最大的问题是geographies.map
必须是可更新的并接受字符串参数elementId
,同时还要成为具有自己方法的对象。这是我最近的失败尝试:
interface Map {
constructor(elementId: string): Map;
findAddress(addressDesc: any, callback: any): any;
// Other signatures elided
}
interface GeographiesStatic {
map: Map;
// Other members elided
}
declare var geographies: GeographiesStatic;
我应该使用declare class
吗?接口?我需要在底部使用declare var
还是以某种方式杀死窗口名称空间中已经存在的同名对象?任何指导将不胜感激。
答案 0 :(得分:2)
代码使用显示模块模式,该模式通常在TypeScript中用namespace
表示。此文件的简单声明是:
declare namespace geographies {
class map {
constructor(name: string);
findAddress(desc: any, cb: any): any;
}
}