Ответ 1
Правильный способ - использовать старый синтаксис импорта. Новый синтаксис импорта предназначен только для модулей ES, старый синтаксис импорта предназначен для модулей pre-ES6. Эти два являются намеренными. import * as foo from 'foo'
импортирует все свойства модуля 'foo', он не импортирует значение по умолчанию как foo
.
- В объявлении экспорта по умолчанию всегда объявляется экспортированный член с именем по умолчанию и всегда выдается как назначение export.default. Другими словами,
export default
последовательно имеет семантику ES-модуля. Для совместимости с Babel мы могли бы при необходимости генерировать маркер__esModule
, когда модуль имеет экспорт по умолчанию, но мы бы не использовали этот маркер для чего-либо. - Объявление
export =
, которое заменяет другой объект, который будет экспортироваться вместо самого модуля, всегда испускается как назначениеmodule.exports
. Ошибочно иметь другой экспорт в модуле, который используетexport =
. Это существующее поведение TypeScript. - Модуль, который использует
export =
для экспорта другого модуля (будь то внутренний или внешний модуль), может быть импортирован с использованием новых конструкций ES6. В частности, с такими модулями можно использовать удобный импорт деструктуризации. Шаблон использованияexport =
для экспорта другого модуля распространен в файлах .d.ts, которые предоставляют представление CommonJS/AMD внутреннего модуля (например, angular.d.ts). - Модуль, который использует
export =
для экспорта немодульной сущности вместо самого модуля, должен быть импортирован с использованием существующего синтаксисаimport x = require("foo")
, как сегодня.
Обновление 2016: Компилятор TypeScript в какой-то момент начал разрешать import * as foo from 'legacy-module-foo'
получать по умолчанию импорт устаревшего модуля в определенных обстоятельствах. Это нарушение спецификации ES6 (§15.2.1.16, "Значение" * "означает, что импорт запрос предназначен для целевых модулей объект пространства имен.").
Когда устаревшие модули, импортируемые таким образом, обновляются в модулях ES6, импорт по умолчанию для этих модулей перестанет работать (поскольку * as foo
импорт должен импортировать объекты пространства имен), что может быть очень запутанным, если вы не знаю, что это взлом TypeScript/SystemJS. Возможно также, что последующая перестройка TypeScript спецификации ES приведет к их разрыву.
Таким образом, вы, вероятно, предпочтете продолжить использование устаревшего синтаксиса импорта, описанного выше, для загрузки устаревших модулей, чтобы не путать себя и других разработчиков, работающих над вашим кодом, о том, как работают импортеры имён ES6, и чтобы избежать путающих изменений.