重载Typescript中的全局函数时的参考模块

时间:2018-12-23 22:11:13

标签: typescript typescript-declarations

我正在使用moment.js(特别是moment-timezone),该接口的界面为DurationDuration.prototype.valueOf()返回一个数字,因此在JavaScript中,调用

setInterval(myCallback, moment.duration(30, 'seconds'));

工作正常。

我想编写一个允许这样做的TypeScript声明文件。

global.d.ts

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中的设置的内容,但这对我来说不是一个选择,这实际上似乎是应该首先实现的。

1 个答案:

答案 0 :(得分:0)

这需要两个步骤:

  1. declare global范围之外声明模块。
  2. 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;
    }
}