如何在 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;
}
}
这是有效的,但它只是一个示例,并不完整。作为例子,现在就足够了:)
但我的问题有三方面:
- 鉴于上面的简短示例,您会采取不同的做法吗?
- 如果我从所有界面中删除
export
关键字,它仍然有效。我还应该离开它吗?它有什么作用?
鉴于用法 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
的回调类型
IDevice
有 ready
方法,它接受传递给 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;
...
}
我在我的应用程序(不是 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;
}
}
这是有效的,但它只是一个示例,并不完整。作为例子,现在就足够了:)
但我的问题有三方面:
- 鉴于上面的简短示例,您会采取不同的做法吗?
- 如果我从所有界面中删除
export
关键字,它仍然有效。我还应该离开它吗?它有什么作用? 鉴于用法
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
的回调类型IDevice
有 ready
方法,它接受传递给 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;
...
}