Подтвердить что ты не робот

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, и мне нужен один файл для загрузки констант.

4b9b3361

Ответ 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'