导入json文件时的Typescript编译器错误

所以代码很简单:

calls.json

{"SERVER":{ "requests":{ "one":"1" } } } 

file.ts

 import json = require('../static/calls.json'); console.log(json.SERVER); 

生成的javascript是正确的,并且在运行节点js服务器时,控制台日志json.SERVER会打印“{requests:{one:'1'}}”。

打字稿编译器(commonjs)不过,不知何故并不特别喜欢这种情况,并抛出:“找不到模块”../static/calls.json'“。

当然,我试图写一个.d.ts文件,如下所示:

 declare module '../static/calls.json'{ var exp:any; export = exp; } 

这显然会抛出:“环境模块声明不能指定相对模块名称”。

我也尝试了不同的变体,如:

 declare module 'calls.json' { import * as json from '/private/static/calls.json'; export = json; } 

然后要求:

 import json = require('calls.json'); 

没有正常工作,并有自己的小编译器错误:)

我想使用一个外部.json文件,因为我使用commonjs serverside和amd clientside,我想单个文件加载常量。

使用var而不是import

 var json = require('./calls.json'); 

你正在加载一个JSON文件,而不是一个模块,所以不应该使用import是这种情况。 当使用varrequire()被再次视为正常函数。

如果你使用的是Node.js定义,一切都应该正常工作,否则require定义。

可以通过使用import语句来完成,如果使用已经与json-loader一起打包的webpack v2 。

请注意,这不是asynchronous

 import data from './data.json';//Note that this is not async 

此外,在typings.d.ts中添加以下通配符模块,以避免typecript错误说: Cannot find module

 declare module "*.json" { const value: any; export default value; } 

对于任何对async导入感兴趣的人,请查看这篇文章

另一个解决scheme是将data.json更改为data.ts并像这样导出

 export default { "key" : { ... } } 

并按照您的预期进行导入:

 import * as data from './data.ts'