Подтвердить что ты не робот

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 на уровне приложения, но мы, похоже, остаемся в холоде на наиболее фундаментальном аспекте разработки прикладного масштаба, а именно, как макет и файлы структурных кодов и то, как все связано во время выполнения.

4b9b3361

Ответ 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

Это немного грубо и готово на этом этапе, но это работает для меня по достаточно сложному проекту.