Простите мое незнание в этом вопросе, я застрял и надеюсь получить какое-то руководство.
Возьмите этот пример класса Greeter, найденный на TypeScript страница детской площадки:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
Мне было поручено создать и управлять одним компонентом, который можно использовать как в простой среде HTML + JavaScript, так и в приложении Angular. Я управляю / пишу этот код на TypeScript и использую TypeScript для компиляции вывода как JavaScript.
Возвращаясь к приведенному выше примеру, если бы я хотел сделать этот класс доступным (как импорт) в Angular, мне нужно было бы экспортировать класс?
export class Greeter {
...
}
Когда я это делаю, страница выдает ошибки:
Uncaught ReferenceError: define is not defined
Скомпилированный JavaScript выглядит так:
define(["require", "exports"], function (require, exports) {
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Greeter = /** @class */ (function () {
function Greeter(message) {
this.greeting = message;
}
Greeter.prototype.greet = function () {
return "Hello, " + this.greeting;
};
return Greeter;
}());
exports.Greeter = Greeter;
var greeter = new Greeter("world");
});
Поскольку класс Greeter теперь привязан к этому блоку определения, я, очевидно, не могу создать экземпляр нового класса как такового:
let greeter = new Greeter("world"); // < -- Won't work.
Выдает ошибку:
Uncaught ReferenceError: Greeter is not defined
Это Angular, а не AngularJS. Что касается использования его с Angular, еще не совсем так, но идея состоит в том, что да, я хотел бы импортировать файл, а затем определить его как компонент. На данный момент это не пакет NPM, но применима та же идея: включите общий пакет JS где-нибудь в корневом приложении, обратитесь к нему или импортируйте его и используйте в приложении.
Это одна из многочисленных проблем, которые вам придется решить при настройке приложения Angular с нуля. Как показывает практика, приложения Angular используют Angular CLI для создания лесов и построения. TS уже настроен для вас. Альтернативой является использование шаблонного проекта, в котором TS снова уже настроен для вас. В практических целях вы можете придерживаться их и узнать, как там все делается. Вы можете узнать из официального Angular plunk, который, конечно же, содержит конфигурацию TS, plnkr.co/edit/tpl:AvJOMERrnz94ekVua0u5



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хороший вопрос, то, что вы спрашиваете, определенно разумно.
Прежде всего, стоит упомянуть, что то, что вы называете «ванильным JavaScript», - это ES5 с совместимостью библиотек модулей AMD. ES6 представил для JavaScript модули на уровне родного языка, что и является синтаксисом export и import.
TypeScript имеет опция компилятора--module, который позволяет вам выбирать, для какого целевого модуля компилировать и для чего производить вывод. Однако в случае систем с внешними модулями, таких как AMD и CommonJS, он фактически не выводит модульную систему, необходимую для ее работы, а просто генерирует JavaScript, совместимый с этими системами. Вам решать, включать ли модульную систему, такую как RequireJS, или запускать в среде со встроенной поддержкой, такой как модульная система CommonJS в NodeJS. Если вы установите для цели --module значение es6, вы увидите, что он оставляет операторы export как есть, и это будет работать в браузере, поддерживающем модули ES6 (при условии, что путь импорта разрешается в файл, к которому браузер может получить доступ).
Также стоит упомянуть, что с помощью сборщиков JavaScript, таких как Webpack или Browserify, вы можете взять практически любой вывод модуля из TypeScript и связать его для браузера без необходимости самостоятельно вводить среду выполнения модуля, потому что сборщик позаботится об этом.
Надеюсь, это поможет.
Спасибо @Aaron, ценим отзывы! Очень полезно. Мы учтем все эти моменты и соответствующим образом проведем рефакторинг.
defineпоявляется в Playground, потому что по умолчанию используется модуль AMD. Это не так в реальном коде и зависит от того, какой параметр компилятораmoduleустановлен на. Как именно код связан с Angular? Это в первую очередь Angular или AngularJS? Вы используете этот файл в исходных файлах проекта Angular? В этом случае он будет скомпилирован как другие файлы. Вы экспортируете его как пакет NPM?