为现有JavaScript进行TypeScript声明

时间:2018-06-20 18:46:45

标签: javascript typescript typescript-typings

一个前同事写了一小段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还是以某种方式杀死窗口名称空间中已经存在的同名对象?任何指导将不胜感激。

1 个答案:

答案 0 :(得分:2)

代码使用显示模块模式,该模式通常在TypeScript中用namespace表示。此文件的简单声明是:

declare namespace geographies {
  class map {
    constructor(name: string);
    findAddress(desc: any, cb: any): any;
  }
}