如何在TypeScript中为Twilio全局JS库创建环境声明?

时间:2017-02-18 16:53:22

标签: typescript namespaces global declaration

我在我的应用程序(而不是Twilio Node)上使用Twilio.js库,并且此库没有可用的模块或类型。只有Twilio个全局变量可供使用。

最简单的环境声明可以避免IDE中的错误:

declare const Twilio: any;

但我想更进一步,为此我一直在阅读TypeScript手册和其他一些资源。我特别关注this link

到目前为止,这就是我所拥有的:

declare const Twilio: Twilio.Base;

declare namespace Twilio {

    export interface Base {
        Device: Device;
    }

    export interface Device {
        ready(handler: DeviceCallback): void;
    }

    export interface DeviceCallback {
        (device: Device): void;
    }

}

这是有效的,但它只是一个样本,它不完整。例如,现在就足够了:))

但我的问题有三个方面:

  1. 鉴于上面的简短样本,您会采取不同的做法吗?
  2. 如果我从所有接口中删除export关键字,它仍然有效。我还应该离开吗?它做了什么?
  3. 鉴于使用Twilio.Device.ready(this.handleTwilioDeviceReady.bind(this));,IDE将鼠标悬停在鼠标上时会给我以下内容:

    • Twilioconst Twilio: Twilio.Base
    • Twilio.Device(property) Twilio.Base.Device: Twilio.Device
    • Twilio.Device.ready(method) Twilio.Device.ready(handler: Twilio.DeviceCallback): void

    • 如何摆脱在IDE中显示的Twilio.Base,而不是显示:

      • Twilioconst Twilio: Twilio
      • Twilio.Device(property) Twilio.Device: Twilio.Device

1 个答案:

答案 0 :(得分:1)

我已经看了API,我认为以下应该是一个很好的起点作为环境声明文件。

declare namespace Twilio {

    class Connection {
        // Constructor does not appear to be available to user.
        private constructor();
        // Add Connection Methods and Properties Here
    }

    // Not immediately clear if Twilio.Device is a class or not.
    interface IDevice {
        setup(token, options);
        ready(handler);
        offline(handler);
        incoming(handler);
        connect(params) : Connection;
        // Add Remainder of Twilio.Device properties here.
    }

    /**
     * Twilio.Device appears to be a singleton object that 
     * you don't instantiate yourself. You can use
     * the below to declare its presence.
     */
    let Device : IDevice;
}

还有一些说明:

declare const Twilio: Twilio.Base;

通过以下命名空间声明使这变得多余,该声明具有声明存在具有您声明的名称和成员的普通旧JS对象的效果。

在声明环境类/名称空间时,

导出不会出现以具有任何功能。只有在您声明具有默认导出成员的模块时,或者如果您正在编写TS文件并且需要声明哪些类和接口可以公开访问时,它才是必需的。

编辑:Device.Ready的回调类型

IDevice具有ready方法,该方法接受传递IDevice对象的函数参数,并且不会返回任何内容。这种功能的类型签名是:

(device : IDevice) => void;

内联声明将是:

ready((device : IDevice) => void) : void;

鉴于你要重复使用这个回调类型几次,你应该创建一个type alias,然后像这样引用它:

type DeviceCallback = (device : IDevice) => void;

interface IDevice {
    ...
    ready(handler: DeviceCallback) : void;
    offline(handler : DeviceCallback) : void;
    ...
}