Ошибка компилятора Typescript при импорте файла json

таким образом, код прост:

звонки.в JSON

{"SERVER":{
    "requests":{
      "one":"1"
    }
} }
.ТС
import json = require('../static/calls.json');
console.log(json.SERVER);

сгенерированный javascript является правильным и при запуске сервера JS узла, журнал консоли json.Сервер печатает "{requests: { one: '1'}}", как и должно быть.

компилятор typescript (commonjs), однако, как-то не особенно нравится эта ситуация и бросает: "не удается найти модуль"../ статические / звонки.формат JSON'".

конечно, я попытался написать .д.ТС файл, например:

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

это, очевидно, бросает: "объявление окружающего модуля не может указать относительное имя модуля".

Я также пробовал разные варианты, например:

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

а потом требует:

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

не работает должным образом и имеют свои собственные небольшие ошибки компилятора :)

Я хочу использовать внешний .JSON-файл, потому что я использую commonjs serverside и AMD clientside, и мне нужен один файл для загрузки констант.

6 ответов


использовать var вместо import.

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

вы загружаете файл JSON, а не модуль, так import не следует использовать в этом случае. Когда var используется require() снова рассматривается как нормальная функция.

если вы используете узел.JS определение, все должно просто работать, иначе require необходимо будет определить.


другое решение-изменить data.json to data.ts и экспортировать вот так

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

и импорт, как и следовало ожидать:

import { default as data } from './data'

это может и сделать с помощью import заявление при использовании webpack v2 который уже упакован с в JSON-погрузчик.

обратите внимание, что это не асинхронный

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


TS 2.9 добавлена поддержка хорошо типизированного импорта json. Просто добавьте:

{
  "compilerOptions": {
    "resolveJsonModule": true
  }
}

в своем tsconfig.json или jsconfig.json. Теперь импортирует такие как:

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

и

import * as json from '../static/calls.json';

должен быть разрешен и иметь правильные typings тоже!


по состоянию на машинопись 2.9 вы можете импортировать файл JSON изначально без каких-либо дополнительных взлома/загрузки.

следующий отрывок копируется из указанной выше ссылки.

...TypeScript теперь может импортировать файлы JSON в качестве входных файлов при использовании стратегии узла для moduleResolution. Это означает, что вы можете использовать файлы json как часть своего проекта, и они будут хорошо набрали!

./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`

For Angular 6 it can work with simple HTTP get call as below

Service
//interface, could be Array , object 
export interface ResultJSON{

}
 //Read JSON file for 3DWide
  getJSON() {
    return this.http.get(this.filepathUrl);
  }

Component :import both service and interface and use as below
resultJSON :ResultJSON;
 this
      .testService
      .getJSON()
      .subscribe((data: ResultJSON) => {
           this.resultJSON= data;
           console.log(this.resultJSON); 


         });