Donc le code est simple:
calls.json
{"SERVER":{
"requests":{
"one":"1"
}
} }
fichier.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 de noeud js, le journal de la console json.SERVER imprime '{request: {one: {1:' 1 '}}', comme il se doit.
Cependant, le compilateur TypeScript (commonjs) 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 lance évidemment: "La déclaration de module ambiant ne peut pas spécifier le nom de module relatif".
J'ai aussi essayé différentes variantes, comme:
declare module 'calls.json' {
import * as json from '/private/static/calls.json';
export = json;
}
et exigeant ensuite:
import json = require('calls.json');
Aucun ne fonctionne correctement et a ses propres petites erreurs de compilation :)
Je souhaite utiliser un fichier .json externe car j'utilise commonjs serverside et AMD clientside et je souhaite un fichier unique pour le chargement de constantes.
Utilisez var
au lieu de import
.
var json = require('./calls.json');
Vous chargez un fichier JSON, pas un module, donc import
ne devrait pas être utilisé dans ce cas. Lorsque var
est utilisé, require()
est à nouveau traité comme une fonction normale.
Si vous utilisez une définition de Node.js, tout devrait fonctionner, sinon require
devra être défini.
Une autre solution consiste à changer data.json
à data.ts
et exporter comme ça
export default {
"key" : {
...
}
}
et importez comme vous le souhaitez:
import { default as data } from './data'
Cela peut également être effectué à l'aide de l'instruction import
si vous utilisez webpack v2 qui est déjà fourni avec - json-loader .
Notez que ce n'est pas asynchrone
import data from './data.json';//Note that this is not async
En outre, dans votre fichier typings.d.ts
, Ajoutez le texte suivant module générique pour éviter toute erreur TypeScript disant: Cannot find module
declare module "*.json" {
const value: any;
export default value;
}
Pour ceux qui sont intéressés par async
importations, cochez la case cet article par 2uality
TS 2.9 ajout du support pour les importations json bien typées . Il suffit d'ajouter:
{
"compilerOptions": {
"resolveJsonModule": true
}
}
dans votre tsconfig.json
ou jsconfig.json
. Maintenant, les importations telles que:
import json = require('../static/calls.json');
et
import * as json from '../static/calls.json';
devrait être résolu et avoir des typages appropriés aussi!
À compter de TypeScript 2.9 , vous pouvez importer un fichier JSON en mode natif sans qu'aucun autre piratage/chargeur ne soit nécessaire.
L'extrait suivant est copié à partir du lien ci-dessus.
... TypeScript peut désormais importer des fichiers JSON en tant que fichiers d'entrée lors de l'utilisation de la stratégie de nœud pour moduleResolution. Cela signifie que vous pouvez utiliser des fichiers json dans le cadre de leur projet et ils seront bien typés!
./src/settings.json
{
"dry": false,
"debug":
./src/foo.ts
import settings from "./settings.json";
settings.debug === true; // Okay
settings.dry === 2; // Error! Can't compare a `boolean` and `number`