【问题标题】:How to create ambient declarations for Twilio global JS library in TypeScript?如何在 TypeScript 中为 Twilio 全局 JS 库创建环境声明?
【发布时间】:2017-02-18 16:53:22
【问题描述】:

我在我的应用程序(不是 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)); 的用法,当我将鼠标悬停在 IDE 上时,我会得到以下信息:

    • Twilio: const 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 而改为显示:

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

【问题讨论】:

  • 看起来 Twilio 有一个类型定义,可通过 npm 以 @types/twilio 形式使用:npmjs.com/package/@types/twilio
  • @Seamus 那是给Twilio Node.js helper library,不是给我正在使用的那个。忘记链接了...
  • 仅供参考,Twilio.Device.ready(() => this.handleTwilioDeviceReady()); 会更惯用 TypeScript :)
  • @JKillian 感谢您的建议。虽然我更喜欢autobin-decorator,但我有一个issue让它工作:(

标签: typescript namespaces global declaration


【解决方案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 对象的存在。

在声明环境类/命名空间时,Export 似乎没有任何功能。仅当您要声明具有默认导出成员的模块时,或者您正在编写 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;
    ...
}

【讨论】:

  • 太好了,正是我想要的:) 我确实有 2 个后续问题,一个可能需要一个新的 SO 问题...例如,鉴于 Twilio 文档:.ready( handler(device) )您将如何正确声明此功能?我看到两个选项:a) ready(handler: Function): voidb) ready(handler: (device: IDevice) => void): void。你的建议是什么?是否有 c) 替代方案?
  • 我的第二个后续问题需要更多文字和更好的示例,您介意我创建一个新问题并将其链接回此处供您查看吗?您似乎对 TS 声明文件了如指掌,而且对 SO 具有这种知识的人似乎并不多。
  • @RicardoAmaral 确定!这样做,我都会回答:)
  • 这里是:stackoverflow.com/q/42398170/40480 同时,如果你能回答我上面的 a) 问题,那就太好了。我想这只是一个偏好问题,所以不需要额外的问题,或者你想要一个?
  • @RicardoAmaral 我已经用 C 选项的处理程序问题修改了我的答案:)
猜你喜欢
  • 2017-07-12
  • 1970-01-01
  • 2022-01-15
  • 2020-02-10
  • 2018-12-16
  • 2019-01-04
  • 2017-06-06
  • 1970-01-01
  • 2010-10-30
相关资源
最近更新 更多