Чому це не працює
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.