我正在使用moment.js(特别是moment-timezone
),该接口的界面为Duration
。 Duration.prototype.valueOf()
返回一个数字,因此在JavaScript中,调用
setInterval(myCallback, moment.duration(30, 'seconds'));
工作正常。
我想编写一个允许这样做的TypeScript声明文件。
export {};
declare global {
function setTimeout(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;
function setInterval(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;
}
当我上任
import { Duration } from 'moment-timezone';
它将.d.ts文件视为模块声明,因此不会影响全局名称空间。
我本想将import
移到declare global
范围内,但仍将Duration
视为any
。
我也尝试过
/// <reference path="node_modules/@types/moment-timezone/index.d.ts" />
但这似乎无济于事。
我已经看到了一些答案,其中提到了有关tsconfig.json中的设置的内容,但这对我来说不是一个选择,这实际上似乎是应该首先实现的。
答案 0 :(得分:0)
这需要两个步骤:
declare global
范围之外声明模块。import
放在declare global
范围内。对于OP示例:
export {}
declare module 'moment-timezone';
declare global {
import { Duration } from 'moment-timezone';
function setTimeout(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;
function setInterval(callback: (...args: any[]) => void, ms: Duration, ...args: any[]): NodeJS.Timeout;
}
如果要将自己的类型导入外部模块,请将import
放在declare module
范围内,并确保您的类型在其自身的declare module
范围内。
类型/my-custom-types.d.ts
declare module 'my-custom-types' { // <-- this was the missing line that was giving me trouble
export interface MyStringInterface {
valueOf(): string;
}
}
类型/some-lib/index.d.ts
declare module 'some-lib' {
import { MyStringInterface } from 'my-custom-types';
export interface SomeExistingClass {
// Add your own signatures
someExistingMethod(stringParam: MyStringInterface): any;
}
}