5

我试图停止使用 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'

有解决方法吗?

4

1 回答 1

7

回答我自己的问题。最后,我在一个使用全局变量和outFile. 我们需要.d.ts为每个库单独设置一个。例子:

  1. 向 Moment.js 添加与 globals/UMD 的兼容性。为了与 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;
    
于 2017-05-04T20:26:54.723 回答