我有一个针对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.ts
和b.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}}文件。似乎在单独的模块中使用它们是不够的。
答案 0 :(得分:3)
有没有办法在同一个项目中使用这两个.d.ts文件
我强烈建议您随身携带commonjs
。这就是React社区的先锋,它是一个更简单的工作流程。只需使用CommonJS + webpack(从here获取惰性require.ensure
)。
答案 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);