Typescript Ошибка компилятора при импорте файла json
Итак, код прост:
calls.json
{"SERVER":{
"requests":{
"one":"1"
}
} }
file.ts
import json = require('../static/calls.json');
console.log(json.SERVER);
сгенерированный javascript корректен, и при запуске сервера node js консольный журнал json.SERVER печатает '{request: {one:' 1 '}}', как и должно быть.
Однако компилятор typescript (commonjs) каким-то образом не особенно похож на эту ситуацию и бросает: "Не удается найти модуль".. /static/calls.json ".
Конечно, я пробовал написать файл .d.ts, например:
declare module '../static/calls.json'{
var exp:any;
export = exp;
}
это, очевидно, бросает: "Объявление модуля Ambient не может указывать относительное имя модуля".
Я также пробовал разные варианты, например:
declare module 'calls.json' {
import * as json from '/private/static/calls.json';
export = json;
}
а затем требуется:
import json = require('calls.json');
Не работают нормально и имеют свои собственные ошибки компилятора:)
Я хочу использовать внешний .json файл, потому что я использую commonjs serverside и amd clientside, и мне нужен один файл для загрузки констант.
Ответы
Ответ 1
Используйте var
вместо import
.
var json = require('./calls.json');
Вы загружаете файл JSON, а не модуль, поэтому import
не следует использовать в этом случае. Когда используется var
, require()
снова обрабатывается как нормальная функция.
Если вы используете определение Node.js, все должно просто работать, иначе require
нужно будет определить.
Ответ 2
Это также можно сделать с помощью оператора import
, если вы используете webpack v2, который уже упакован json-loader.
Обратите внимание, что это не async
import data from './data.json';//Note that this is not async
Кроме того, в typings.d.ts добавьте следующий шаблонный шаблон, чтобы избежать ошибки typescript: Cannot find module
declare module "*.json" {
const value: any;
export default value;
}
Для всех, кто интересуется импортом async
, проверьте эту статью по 2uality
Ответ 3
Другим решением является изменение data.json
на data.ts
и экспорт следующим образом
export default {
"key" : {
...
}
}
и импортировать, как и следовало ожидать:
import * as data from './data.ts'