2017-02-18 64 views
1

我在我的应用程序(不是Twilio节点)上使用Twilio.js库,并且没有可用的此库的模块或类型。只有一个可用的全局变量Twilio如何在TypeScript中为Twilio全局JS库创建环境声明?

最简单的环境声明可以有避免在IDE的错误是这样的:

declare const Twilio: any; 

但我想走得更远一点,对于我一直在阅读打字稿手册和其他一些资源。我特别重视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));,集成开发环境给我在徘徊我的鼠标时,以下几点:

    • 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,而不是s如何:

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

看起来存在用于Twilio可用的类型定义为'@类型/ twilio'通过NPM:https://www.npmjs.com/package/@types/twilio – Seamus

+0

@接缝我们这是[Twilio Node.js助手库](https://twilio.github.io/twilio-node/),而不是我正在使用的那个。忘了链接,... –

+1

只是fyi,'Twilio.Device.ready(()=> this.handleTwilioDeviceReady());'会更习惯TypeScript :) – JKillian

回答

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; 

内联的声明是:

既然你要重用这个回调键入了几下,你应该创建一个type alias和然后参考它像这样:

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

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

太棒了,正是我在找的东西:)我有2个后续问题,可能需要一个新的SO问题......作为一个例子,鉴于Twilio文档为此:'.ready(handler(device))'你会如何正确地声明这个函数?我看到两个选项:** a)**'ready(handler:Function):void'或** b)**'ready(handler:(device:IDevice)=> void):void'。你会推荐什么?是否有** c)**替代品? –

+0

我的第二个后续问题需要更多的文本和更好的例子,如果我创建一个新问题并将其链接回这里供您参考,您是否介意?你似乎知道你周围的TS声明文件的方式,看起来好像没有太多人拥有这样的知识。 –

+0

@RicardoAmaral肯定的事情!这样做,我会回答两个:) –