2016-12-26 10 views
3

Я пытаюсь прекратить использование TSD для получения определений типов в проекте, который использует множество libaries через глобальные переменные (опция outFile используется в tsconfig.json, если это имеет значение). В частности, он использует библиотеку Moment таким образом. Moment предоставляет its own type definitions как часть пакета 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' 

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

+1

Я думаю, что может быть ошибка: https://github.com/Microsoft/TypeScript/issues/13175 –

+0

Даже если это фиксируется, как я смогу объявить переменную с тем же именем, что и псевдоним импорта? В настоящее время TS не позволяет этого делать. – thorn

+0

Должен быть объявлен 'const moment: _moment.Moment'? Я получаю 'undefined' в моей консоли, если я пытаюсь получить доступ к' moment.format' и тому подобное. –

ответ

2

Отвечая на мой вопрос. Наконец, я нашел способ увеличить типизацию библиотек в проекте старой школы, который использует глобальные переменные и 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; 
    

 Смежные вопросы

  • Нет связанных вопросов^_^