Почему не работает
import * as MC from './MyClass';
Это importсинтаксис в стиле ES6 / ES2015 . Точное значение этого слова: «Возьмите загруженный объект пространства имен модуля ./MyClassи используйте его локально как MC». Примечательно, что « объект пространства имен модуля » состоит только из простого объекта со свойствами. Объект модуля ES6 не может быть вызван как функция или с new.
Для того, чтобы сказать это снова: ES6 объект модуля пространства имен не может быть вызван в качестве функции или с new.
Вещь, которую вы importиспользуете * as Xиз модуля, определяется только как имеющая свойства. В пониженном уровне CommonJS это может не соблюдаться полностью, но TypeScript сообщает вам, каково поведение, определенное стандартом.
Что работает?
Чтобы использовать этот модуль, вам нужно будет использовать синтаксис импорта в стиле CommonJS:
import MC = require('./MyClass');
Если вы управляете обоими модулями, вы можете использовать export defaultвместо них:
MyClass.ts
export default class MyClass {
constructor() {
}
}
MyConsumer.ts
import MC from './MyClass';
Мне грустно об этом; Правила глупы.
Было бы неплохо использовать синтаксис импорта ES6, но теперь я должен это сделать import MC = require('./MyClass');? Наступил такой 2013 год! Ламе! Но горе - нормальная часть программирования. Перейдите к пятому этапу модели Кюблер-Росс: Принятие.
TypeScript здесь говорит вам, что это не работает, потому что это не работает. Есть хаки (добавление namespaceобъявления в MyClass- популярный способ притвориться, что это работает), и они могут работать сегодня в вашем конкретном сборщике модулей с понижением уровня (например, свертке), но это иллюзия. В мире пока нет реализаций модулей ES6, но так будет не всегда.
Представьте себя в будущем, пытаясь работать на аккуратной собственной реализации модуля ES6 и обнаруживая, что вы настроили себя на серьезную неудачу, пытаясь использовать синтаксис ES6 для выполнения чего-то, чего ES6 явно не делает .
Я хочу воспользоваться моим нестандартным загрузчиком модулей
Возможно, у вас есть загрузчик модулей, который «услужливо» создает defaultэкспорт, когда его нет. Я имею в виду, что люди создают стандарты по какой-то причине, но игнорировать стандарты иногда весело, и мы можем подумать, что это круто.
Измените MyConsumer.ts на:
import A from './a';
И укажите allowSyntheticDefaultImportsкомандную строку или tsconfig.jsonпараметр.
Обратите внимание, что это allowSyntheticDefaultImportsникак не меняет поведение вашего кода во время выполнения. Это просто флаг, который сообщает TypeScript, что ваш загрузчик модуля создает defaultэкспорт, когда его нет. Это не заставит ваш код работать в nodejs волшебным образом, если этого не было раньше.
javascriptв качестве основного тега и оставитьecmascript-6, потому что здесь основной тегtypescript. Вопрос ошибочно предполагает, чтоexport =(функция TS) может быть связана сimport ... from, в то время как она должна быть связана сimport =. Это в основном импорт / экспорт модуля ES6 по сравнению с CJS / AMD.