Ссылочный модуль при перегрузке глобальной функции в Typescript - PullRequest
0 голосов
/ 24 декабря 2018

Я использую moment.js (в частности, moment-timezone), который имеет интерфейс под названием Duration.Duration.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 голосов
/ 08 января 2019

Для этого требуется два шага:

  1. Объявить модуль вне области действия declare global.
  2. Поместить import s в область действия 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;
    }
}

набрав / некоторые-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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...