So the code is simple:
calls.json
{"SERVER":{
"requests":{
"one":"1"
}
} }
file.ts
import json = require('../static/calls.json');
console.log(json.SERVER);
the generated javascript is correct and when running the node js server, the console log json.SERVER prints '{ requests: { one: '1' } }', as it should.
The typescript compiler (commonjs) however, somehow does not particularly like this situation and throws: "Cannot find module '../static/calls.json'".
Ofcourse I tried writing a .d.ts file, like this:
declare module '../static/calls.json'{
var exp:any;
export = exp;
}
this then obviously throws: "Ambient module declaration cannot specify relative module name".
I also tried different variants, like:
declare module 'calls.json' {
import * as json from '/private/static/calls.json';
export = json;
}
and then requiring:
import json = require('calls.json');
None work properly and have their own little compiler errors :)
I want to use an external .json file because I use commonjs serverside and amd clientside and I want a single file for loading constants.
Use
var
instead ofimport
.You're loading a JSON file, not a module, so
import
shouldn't be used is this case. Whenvar
is used,require()
is treated like a normal function again.If you're using a Node.js definition, everything should just work, otherwise
require
will need to be defined.As of Typescript 2.9 you can import JSON file natively without any additional hack/loader needed.
The following excerpt is copied from said link above.
./src/settings.json
./src/foo.ts
TS 2.9 added support for well typed json imports. Just add:
in your
tsconfig.json
orjsconfig.json
. Now imports such as:and
should be resolved and have proper typings too!
This can also be done by using
import
statement if using webpack v2 which is already packed with json-loader.Also, in your
typings.d.ts
file add the following wildcard module to avoid typescript error saying:Cannot find module
For anyone interested in
async
imports, check this article by 2ualityAnother solution is to change
data.json
todata.ts
and export like thisand import as you would expect: