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

How to create ambient declarations for Twilio global JS library in TypeScript?

我在我的应用程序(不是 Twilio 节点)上使用 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));,IDEs 将鼠标悬停在上面时给我以下信息:

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

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

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

我查看了 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 对象,其中包含您声明的名称和成员。

在声明环境 classes/namespaces 时,Export 似乎 没有任何功能。仅当您声明具有默认导出成员的模块时,或者如果您正在编写 TS 文件并需要声明哪些 类 和接口可公开访问时,才有必要。

编辑:Device.Ready

的回调类型

IDeviceready 方法,它接受传递给 IDevice 对象的函数参数,并且不需要 return 任何东西。这种函数的类型签名是:

(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;
    ...
}