Ограничения импорта модулей ES6
Сначала рассмотрим конкретный пример:
В проекте Node импортируйте модуль, используя спецификацию CommonJS:
const koa = require('koa')
При переписывании на TypeScript (версия 1.5+) обычно есть два пути:
-
Используйте метод импорта модуля ES6:
// allowSyntheticDefaultImports: false import * as koa from 'koa' -
Используйте синтаксис импорта модуля TypeScript:
import koa = require('koa')
Они в основном эквивалентны, но спецификация ES6 неimport * asСозданный объект модуля имеет несколько ограничений.
Согласно спецификации объект модуляНе вызывается и не создается, у него есть только свойства.
Итак, если вы хотите вызвать объект или использовать новый метод вallowSyntheticDefaultImports: falseПри настройке следует использовать второй способ в примере.
Усовершенствования импорта модулей CommonJs/AMD/UMD в версии 2.7
В предыдущих версиях TypeScript обрабатывал модули CommonJs/AMD/UMD так же, как модули ES6, что вызывало некоторые проблемы:
-
Как упоминалось ранее, при импорте модуля CommonJs/AMD/UMD TypeScript видит
import * as koa from 'koa'а такжеconst koa = require('koa')эквивалентно, но с использованиемimport * asСозданный модульный объект не может быть фактически вызван и создан. -
Точно так же при импорте модуля CommonJs/AMD/UMD TypeScript видит
import foo from 'foo'а такжеconst koa = require('koa').defaultЭквивалентны, но в большинстве модулей CommonJs/AMD/UMD они не экспортируются по умолчанию.
В версии 2.7 TypeScript предоставляет новую опцию--esModuleInterop, направленный на решение вышеуказанных проблем,
Когда используется этот параметр и используется модуль CommonJs/AMD/UMD, он импортирует вызываемый или инстанцируемый модуль и указывает, что этот модуль должен быть импортирован по умолчанию:
import koa from 'koa'
const app = new koa()
Импорт модуля — это всего лишь несколько декларативных типов.
При импорте модуля с не относительным путем вы можете увидетьCould not find a declaration file for module 'someModule'ошибка, вы можете установить файл объявления соответствующего модуля или написать файл, содержащийdeclare module 'someModule'Файл декларации.
Фактически, когда мы импортируем модуль:
import koa from 'koa'
// import koa = require('koa')
Он делает только две вещи:
- импортировать всю информацию о типе модуля;
- Определение зависимостей времени выполнения.
Когда вы загружаете этот модуль, но не используете его или используете только как тип, модуль будет удален после компиляции.
когда не используется;
import koa from 'koa'
После компиляции:
Только при использовании в качестве типа:
import koa from 'koa'
let k: koa
После компиляции:
var k
При использовании в качестве значения модуль будет сохранен после компиляции:
import koa from 'koa'
const app = new koa()
После компиляции (при условии, что используется commonjs):
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
var koa_1 = __importDefault(require("koa"));
var k = new koa_1.default();
Примечание:__importDefaultдля использования--esModuleInteropМетод создается при выборе опций.
Ссылаться на
- http://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html
- https://stackoverflow.com/questions/35706164/typescript-import-as-vs-import-require?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa
- https://basarat.gitbooks.io/typescript/content/docs/project/external-modules.html