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

TypeScript импорт модуля в nodejs

Что лучше всего использовать для импорта модулей в nodejs с помощью typescript? Я пришел из С# фона, поэтому хочу сделать что-то вроде этого

MyClass.ts

module MyNamespace {
    export class MyClass {
    }
}

app.ts

// something like using MyNamespace
new MyNamespace.MyClass();

или

MyClass.ts

export class MyClass {
}

app.ts

import MyClass = module("MyClass")
new MyClass();

Я знаю, что могу это сделать, и это сработает, но тогда я должен придумать два имени для каждого класса

import MyClass2 = module("MyClass")
new MyClass2.MyClass();

Точка разделяет классы на несколько файлов .ts(желательно один файл на класс). Вопрос в том, как это делается?

4b9b3361

Ответ 1

Здесь у вас есть два варианта:

Если вы настаиваете на использовании модулей CommonJS или AMD, вам придется использовать внешние модули так, как вы описали их в своем вопросе. Независимо от того, используете ли вы модуль для объявления своего пространства имен, в основном это вопрос вкуса. Единственный способ обойти проблему указания двух имен - создать переменную, которая псевдонизирует тип:

mymodule.ts

export module MyNamespace {
    export class MyClass {
    }
}

app.ts

import ns = require('mymodule');
var myclass = new ns.MyNamespace.MyClass();
var myclassalias = ns.MyNamespace.MyClass;
var myclass2 = new myclassalias();

Другой вариант - использовать внутренние модули, которые в основном используются для структурирования вашего внутреннего кода. Внутренние модули вводятся во время компиляции с использованием ссылочных путей.

mymodule.ts

module MyNamespace {
    export class MyClass {
    }
}

app.ts

///<reference path='mymodule.ts'/>
var myclass = new MyNamespace.MyClass();

Думаю, вам придется самому решить, какой из этих двух подходов более уместен.

Ответ 2

Вы можете импортировать модули TypeScript в файл node.js, используя модуль typescript-require, который был создан для этого конкретного цель.

Ответ 3

Я бы рекомендовал не использовать явное ключевое слово module (или namespace), это остаточный остаток более раннего времени. * Обычно вам это не нужно, потому что любой typescript файл с верхним уровнем import или export автоматически является модулем. Ваш второй пример myModule.ts был хорошим.

export class MyClass {
   ...
}

Но когда вы импортируете его в другой модуль typescript, вы захотите использовать что-то вроде этого:

import { MyClass } from './myModule';
var myInstance = new MyClass();

Лично мне не нравится повторяемость строки 1, но это то, что требует язык, поэтому я научился ее принимать. Я думаю, что полезность этого синтаксиса не очевидна, если вы не откажетесь от шаблона файла за класс. Вы выбираете, какие имена импортировать из модуля, чтобы не происходило непреднамеренное загрязнение пространства имен.

Альтернативный синтаксис импорта извлекает все имена из модуля, но вы должны квалифицировать имена с модулем при их использовании. Поэтому он также называют устойчивым к столкновению.

import * as myModule from './myModule';
var myInstance = new myModule.MyClass();

Существуют исключения из общего правила о том, что вам не нужны ключевые слова module/namespace, но не начинайте с фокусировки на них. Модуль Think == ==.