Erreur du compilateur typographique lors de l'importation du fichier json

Le code est donc simple:

Calls.json

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

File.ts

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

Le javascript généré est correct et lors de l'exécution du serveur node js, le journal de la console json.SERVER imprime '{requests: {one:' 1 '}}}, comme il se doit.

Le compilateur dactylographié (commonjs), en quelque sorte, n'aime pas particulièrement cette situation et lance: "Impossible de trouver le module" ../static/calls.json '".

Bien sûr, j'ai essayé d'écrire un fichier .d.ts, comme ceci:

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

Ceci se déclenche bien: "La déclaration du module ambiant ne peut pas spécifier le nom relatif du module".

J'ai également essayé différentes variantes, comme:

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

Et exigeant:

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

Aucun ne fonctionne correctement et a ses propres petites erreurs de compilation 🙂

Je veux utiliser un fichier .json externe car j'utilise commonjs serverside et amd client et je veux un fichier unique pour charger des constantes.

Utiliser var au lieu d' import .

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

Vous chargez un fichier JSON, pas un module, donc l' import ne doit pas être utilisée est ce cas. Lorsque var est utilisé, require() est traité comme une fonction normale à nouveau.

Si vous utilisez une définition Node.js, tout devrait fonctionner, sinon il faudra définir.

Cela peut également être fait en utilisant l'instruction import si vous utilisez le pack web v2 qui est déjà équipé de json-loader .

Notez que ce n'est pas asynchrone

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

De plus, dans vos typings.d.ts, ajoutez le module générique suivant pour éviter l'erreur de typecript en disant: Cannot find module

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

Une autre solution consiste à modifier data.json vers data.ts et à exporter comme ça

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

Et importez comme vous l'attendiez:

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