TypeScript: как сделать существующее пространство имен глобальным?

Я пытаюсь прекратить использовать TSD для получения определений типов в проекте, который использует множество библиотек через глобальные переменные (параметр outFile используется в tsconfig.json, если это имеет значение). В частности, таким образом он использует библиотеку Moment. Moment предоставляет свои собственные определения типов как часть Пакет NPM. Однако эти определения ничего не объявляют в глобальной области видимости. Обратите внимание, что moment одновременно является глобальной переменной типа moment.MomentStatic и пространством имен типа. Используя пакет NPM, как я могу расширить глобальную область видимости таким образом, чтобы все начало работать так, как теперь, со старыми определениями типов, полученными от TSD? А именно, moment должен быть доступен глобально в любом файле как как переменная, так и как пространство имен типа. По сути, я хочу что-то вроде этого:

import * as _moment from 'moment';
declare global {
    const moment: _moment.MomentStatic;
    import moment = _moment;
}

Это не компилируется:

[ts] Imports are not permitted in module augmentations. Consider moving them to the enclosing external module.
[ts] Import declaration conflicts with local declaration of 'moment'

Есть ли обходной путь?


person thorn0    schedule 26.12.2016    source источник
comment
Думаю, это может быть ошибка: github.com/Microsoft/TypeScript/issues/13175   -  person Daniel Rosenwasser    schedule 27.12.2016
comment
Даже если это будет исправлено, как я смогу объявить переменную с тем же именем, что и псевдоним импорта? В настоящее время TS этого не позволяет.   -  person thorn0    schedule 27.12.2016
comment
Следует ли вообще const moment: _moment.Moment объявлять? Я получаю undefined в моей консоли, если пытаюсь получить доступ к moment.format и т.п.   -  person Daniel Rosenwasser    schedule 28.12.2016
comment
В какой консоли? Node.js? Он назначает global только в средах, отличных от AMD и CommonJS. См. unpkg.com/[email protected]   -  person thorn0    schedule 28.12.2016
comment
Извини, я ошибся. Тип переменной moment должен быть moment.MomentStatic, а не moment.Moment.   -  person thorn0    schedule 28.12.2016


Ответы (1)


Отвечая на свой вопрос. Наконец, я нашел способ расширить библиотечные типы в проекте старой школы, который использует глобальные переменные и outFile. Нам нужен отдельный .d.ts для каждой библиотеки. Примеры:

  1. Добавление совместимости с глобальными объектами / UMD в Moment.js. Чтобы оставаться совместимым с TypeScript 1.x, определения типов Moment не включают строку export as namespace. Файл .d.ts (с именем, скажем, augment.moment.d.ts), который это исправляет:

    import * as moment from 'moment';
    export as namespace moment;
    export = moment; 
    
  2. Дополнение определений типов для AngularJS. augment.angular.d.ts:

    import * as angular from 'angular';
    
    declare module 'angular' {
      interface IRootScopeService {
        $$destroyed: boolean;
      }
    }
    
    export as namespace angular;
    export as namespace ng;
    export = angular;
    
person thorn0    schedule 04.05.2017
comment
Как бы странно это не звучало, но я хотел бы подарить вам сладкую-сладкую любовь за этот ответ. - person Hunter Kohler; 05.07.2021