TypeScript:如何使现有命名空间全局化?

时间:2016-12-26 21:12:28

标签: typescript momentjs typescript-typings definitelytyped tsd

我正在尝试停止使用TSD在通过全局变量使用许多库的项目中获取类型定义(如果这很重要,outFile中使用tsconfig.json选项)。特别是,它以这种方式使用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 个答案:

答案 0 :(得分:2)

回答我自己的问题。最后,我找到了一种方法来增加使用全局和outFile的旧式项目中的库类型。我们需要为每个库单独.d.ts。例子:

  1. 将与globals / 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;