无法在同一TypeScript项目中使用requireJS和Node的Require

时间:2016-06-24 15:17:51

标签: node.js typescript requirejs

我有一个针对Node和浏览器的打字稿项目。我在某些脚本中使用了Node require(),而在其他脚本中使用了require() myProject \-- a.ts \-- b.ts \-- node.d.ts \-- require.d.ts 。我的项目目录如下所示:

a.ts

/// <reference path="./node.d.ts" /> var cp = require('child-process'); var a = 'hello world' export = a 包含:

b.ts

/// <reference path="./require.d.ts" /> require('hello',function(x){console.log('world')}); var b = 'hello world' export = b 包含:

require.d.ts

以及从DefinitlyTyped获取node.d.tsb.ts(2,1): error TS2346: Supplied parameters do not match any signature of call target. require.d.ts(396,13): error TS2403: Subsequent variable declarations must have the same type. Variable 'require' must be of type 'NodeRequire', but here has type 'Require'.

编译项目时,我遇到了这些错误:

if(typeof module !== 'undefined' && module.exports){

    // We're in a Node process

}else{

    // We're in an AMD module in the browser:

}

我使用这个习惯来确定要加载的模块,所以我没有在浏览器中加载节点模块,反之亦然。

.d.ts

有没有办法在同一个项目中同时使用这两个{{1}}文件。似乎在单独的模块中使用它们是不够的。

2 个答案:

答案 0 :(得分:3)

  

有没有办法在同一个项目中使用这两个.d.ts文件

我强烈建议您随身携带commonjs。这就是React社区的先锋,它是一个更简单的工作流程。只需使用CommonJS + webpack(从here获取惰性require.ensure)。

还有TypeScript in the browser environment的快速入门。

答案 1 :(得分:0)

最后我需要的是require()由服务器即时编译的JS内容的能力 - which doesn't seem to work with web-pack

为了在原始问题中抑制typescript编译器的错误,我从require.d.ts(RequireJS声明文件)注释掉了这一行:

declare var require: Require;

我使用{foo:bar}['f'+'oo']技巧让tsc'忘记'环境require变量的类型,并将其分配给类型requirejs变量,就像这样:

var requirejs:Require; // requirejs
if(typeof module !== 'undefined' && module.exports){
    // We're in a Node process
    requirejs = require('requirejs');
}else{
    // We're in an AMD module in the browser:
    requirejs = {require:require}['req'+'ire'];
}
// use requirejs for dynamic require statements
requirejs(gather_requirements(),do_things);