TypeScript класс для файла в том же пространстве имен в Node.js
Каков шаблон для одного класса для каждого файла, в котором несколько классов (и, следовательно, несколько файлов) способствуют тому же пространству имен? Я задаю это конкретно в контексте Node.js.
Я знаю, как определить один класс для каждого файла в одном и том же пространстве имен:
Foo/A.ts:
module foo {
export class A {
}
}
Foo/B.ts:
module foo {
export class B {
}
}
main.ts:
/// <reference path="./foo/A.ts"/>
/// <reference path="./foo/B.ts"/>
// TODO: How do I import the foo namespace at runtime?
TypeScript, предположительно, является языком разработки JavaScript на уровне приложения, но мы, похоже, остаемся в холоде на наиболее фундаментальном аспекте разработки прикладного масштаба, а именно, как макет и файлы структурных кодов и то, как все связано во время выполнения.
Ответы
Ответ 1
Это будет работать, если все файлы TypeScript скомпилированы в один файл JavaScript с помощью параметра --out
. Дополнительный код не требуется. Без этой опции main.js(from main.ts) не увидит модуль foo
и будет ReferenceError
.
Благодаря Basarat для ссылки на одно из его видео, которое рекомендует параметр --out
: http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1
Ответ 2
В nodejs
каждый файл является модулем. Когда вы пишете код для nodejs, использование module
(то, что машинопись вызывает внутренние модули) не требуется.
Foo в файле A
на самом деле является A.foo
, а foo в файле B
на самом деле B.foo
. Так работает nodejs. Typescript следует тому, что принято в nodejs.
Подробнее о внешних и внутренних модулях: http://www.youtube.com/watch?v=KDrWLMUY0R0&hd=1.
PS по поводу:
наиболее фундаментальный аспект разработки приложений
Это фундаментально в браузере, а не в nodejs. В nodejs нет глобальной области видимости, как в браузере.
Ответ 3
Как упоминает Басарат, в Node.js файлы являются модулями. Правильный способ написания кода, над которым вы работаете:
Foo/A.ts:
class A {
}
export = A;
Foo/B.ts:
class B {
}
export = B;
main.ts:
import A = require('./foo/A');
import B = require('./foo/B');
Это подробно описано в разделе "Импорт и экспорт" Полного руководства по TypeScript.
Ответ 4
Немного поздно для вечеринки, но я написал плагин grunt, который позволяет использовать стиль программирования для класса/класса в формате node и скомпилировать этот код как для AMD (браузера), так и для CommonJS (node), избегая при этом использования прокладок на стороне клиента, таких как requireJS.
https://www.npmjs.org/package/grunt-contrib-serverify-ts
Это немного грубо и готово на этом этапе, но это работает для меня по достаточно сложному проекту.