【发布时间】:2017-07-12 21:31:15
【问题描述】:
这是this one 的后续问题。
鉴于该问题的答案,假设我有以下环境声明文件:
declare namespace Twilio {
interface IDevice {
ready(handler: Function): void;
}
let Device: IDevice;
}
这在我的应用程序.ts 文件上运行良好,Twilio.Device.ready 被完全识别。但是我的单元测试使用 Jest 和 AFAIK 运行,它们在 NodeJS 环境中运行。
作为对我的测试的过度简化的模拟,我有这个(也是.ts 文件):
global.Twilio = {
Device: {
ready: () => {},
offline: () => {},
error: () => {},
}
};
但是这个Twilio 实例无法识别。我可以通过在.d.ts 文件中添加如下内容来解决此问题:
declare global {
namespace NodeJS {
interface Global {
Twilio: any;
}
}
}
export = {}; // This is needed otherwise `declare global` won't work
但是,我不能将这段代码与我第一次提到的declare namespace Twilio 放在同一个文件中。它们需要位于单独的文件中,否则我的测试中的 global.Twilio 将被识别,但我的代码中的 Twilio.Device 不会。
所以我的问题是,如何让Twilio 的两个实例在应用代码和测试代码中都被识别?
作为一个额外的问题,如果我能以某种方式使用 Twilio 命名空间声明作为 NodeJS 的类型 Twilio global 而不是 any,那就太好了。
编辑:
在与 Richard Seviora 愉快地聊天并讨论了我的所有问题后,我最终为我的项目提供了以下 twilio.d.ts 文件:
/**
* Namespace declaration for the Twilio.js library global variable.
*/
declare namespace Twilio {
type DeviceCallback = (device : IDevice) => void;
type ConnectionCallback = (connection : IConnection) => void;
type ErrorCallback = (error : IError) => void;
interface IConnection {
parameters: IConnectionParameters;
}
interface IConnectionParameters {
From?: string;
To?: string;
}
interface IDevice {
cancel(handler: ConnectionCallback): void;
connect(params: IConnectionParameters): IConnection;
disconnect(handler: ConnectionCallback): void;
error(handler: ErrorCallback): void;
incoming(handler: ConnectionCallback): void;
offline(handler: DeviceCallback): void;
ready(handler: DeviceCallback): void;
setup(token: string, params: ISetupParameters): void;
}
interface IError {
message?: string;
code?: number;
connection?: IConnection;
}
interface ISetupParameters {
closeProtection: boolean;
}
let Device: IDevice;
}
/**
* Augment the Node.js namespace with a global declaration for the Twilio.js library.
*/
declare namespace NodeJS {
interface Global {
Twilio: {
// Partial type intended for test execution only!
Device: Partial<Twilio.IDevice>;
};
}
}
希望其他人发现这个问题和理查德在下面的回答很有见地(因为声明文档有点缺乏)。
再次感谢理查德的所有帮助。
【问题讨论】:
标签: node.js typescript namespaces global declaration