2016-11-07 4 views
1

Машинописи компилятор прекрасно работает, когда я импортировать файл JSON с помощьюсказать машинописный скомпилировать JSon файлов

const tasks = require('./tasks.json') 

Однако, когда я бег tsc, выходной каталог не содержит не tasks.json файла, вызывая ошибку во время выполнения.

Есть ли способ сообщить компилятору, что он должен скопировать все json-файлы, или мне нужно вручную скопировать/вставить все мои json-файлы в каталог dist?

мои TSC compilerOptions в настоящее время читает

"compilerOptions": { 
    "target": "es6", 
    "module": "commonjs", 
    "sourceMap": true, 
    "noImplicitAny": true, 
    "removeComments": false, 
    "outDir": "./dist/", 
    "sourceMap": true, 
    "pretty": true, 
    "noImplicitThis": true, 
    "strictNullChecks": true, 
    "sourceMap": true 
    }, 

Спасибо!

+2

Это похоже на что-то grunt/gulp, а не компилятор. – Amy

+0

Вы не компилируете json, у вас будет задача gulp/grunt, чтобы переместить его в ваш общий каталог (wwwroot или тому подобное), мой совет просто сохраните его в общедоступном каталоге, если он нужен только там, тогда вам не нужно двигаться задача. – Shawn

+0

Gulp или grunt можно использовать для копирования файла JSON на ваш уровень, но вы все равно будете иметь проблемы с оператором 'require()' во время выполнения (если только это не выполняется на узле). См. Мой ответ. – Aaron

ответ

1

Машинопись компилятор работает хорошо, когда я импортировать файл JSON с помощью

const tasks = require('./tasks.json') 

машинописи не будет жаловаться на это до тех пор, пока у вас есть глобальный require() функция, определенная, например, с помощью node.d.ts. С настройкой ванили вы бы на самом деле get a compile error that require is not defined.

Даже если вы сказали Машинопись о глобальной require функции он просто видит его как функцию, которая должна вернуть что-то, что не делает компилятор на самом деле анализировать то, что функция требует ("tasks.json") и сделать что-нибудь с этот файл. Это работа с инструментом, например Browserify или Webpack, который может анализировать вашу базу кода для операторов require и загружать практически все (JS, CSS, JSON, изображения и т. Д.) В пакеты времени выполнения для распространения.

Принимая это немного дальше, с машинописью 2.0 Вы можете даже сказать, машинопись компилятор о шаблонах пути модуля, который будет решен и нагруженным Bundler (Browserify или WebPack) с помощью wildcard (*) module name declarations:

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

Теперь вам может импортировать JSON в машинописи с помощью модуля ES6 синтаксиса:

import tasks from "./tasks.json"; 

, который не даст какую-либо ошибки компиляции и transpile вниз к чему-то вроде var tasks = require("./tasks.json"), и ваш пакетирования будет отвечать за разбор выпишите заявления require и создайте свой комплект, включая содержимое JSON.

+0

Так что просто ясно, если мы все еще используем синтаксис 'import tasks from. ./tasks.json", нам все равно нужно найти способ получить json-файл, скопированный в каталог outDir в tsconfig.json? – FrankerZ

+0

@FrankerZ Правильно. Взгляните на [этот ответ] (https://stackoverflow.com/questions/33650399/es6-modules-implementation-how-to-load-a-json-file) – Aaron

Смежные вопросы