在“模块”全局变量上运行 grunt-typescript 时,angular-mock 和 node.js 发生冲突

Posted

技术标签:

【中文标题】在“模块”全局变量上运行 grunt-typescript 时,angular-mock 和 node.js 发生冲突【英文标题】:angular-mock and node.js conflicting when running grunt-typescript on the "module" global variable 【发布时间】:2014-03-22 00:02:30 【问题描述】:

我正在使用 grunt-typescript,它正在编译我所有的 *.ts 文件。我同时使用了 angular-mocks.d.ts 和 node.d.ts,但是我在我的实际 ts 文件中分别引用它们。我仅将 angular-mocks 用于茉莉花测试,并且在 server.ts 文件中使用节点。问题我遇到的是,即使它们被引用单独地,当它们在 grunt-typescript 中编译时,似乎以某种方式将它们转储在一起,以便它们对“模块”的两个不同定义最终发生冲突。如果我使用 tsc(它引用 node.d.ts)自己构建我的 server.ts 文件,它构建得很好。这两者实际上不应该重合,所以对我来说不是真的冲突,除了它正在成为 grunt-typescript 中的一个,它似乎在编译时将所有 *.d.ts 文件一起转储。我认为这是因为它将我所有的 *.ts 文件构建在一起,因此最终将 *.d.ts 文件一起拉到一个公共空间中。

我得到的错误:

c:/node/bills/typings/node/node.d.ts(37,13): 错误 TS2134:后续变量声明必须具有相同的类型。变量 'module' 必须是 '(...modules: any[]) => any' 类型,但这里有类型 ' exports: any;要求(id:字符串):任何; id:字符串;文件名:字符串;加载:布尔值;父母:任何;孩子:任何[]; '。

angular-mocks.d.ts “模块”定义:

declare var module: (...modules: any[]) => any;

node.d.ts “模块”定义:

declare var module: 
    exports: any;
    require(id: string): any;
    id: string;
    filename: string;
    loaded: boolean;
    parent: any;
    children: any[];

【问题讨论】:

【参考方案1】:

这最终对我有用。我将我的测试 .ts 文件拆分为单独的打字稿运行。这导致它不能同时运行我的测试声明和运行时声明。将它们分开后,模块环境声明不再冲突。

    typescript: 
        options:
        
            target: 'es5', //or es3
            base_path: '',
            sourcemap: true,
            declaration: false
        ,
        server: 
            src: ['*.ts']
        ,
        test: 
            src: ['test/*.ts']
        
    ,

    watch: 
        files: ['*.ts', 'test/*.ts'],
        tasks: ['typescript:server', 'typescript:test']
    

【讨论】:

【参考方案2】:

这是一个已知问题!

它已成为pull request/merge ..

解决方法是使用angular.mock.module 而不是module

【讨论】:

不仅仅是一种解决方法! angular-mocks 的类型定义建议您始终使用angular.mock.module

以上是关于在“模块”全局变量上运行 grunt-typescript 时,angular-mock 和 node.js 发生冲突的主要内容,如果未能解决你的问题,请参考以下文章

从导入模块中的函数访问全局变量

动态导入模块作为全局变量

linux下全局安装的npm包无法找到

Python 3 实现定义跨模块的全局变量和使用

nodejs 全局变量和内置模块

node.js中的全局变量——global