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

Как разделить мой модуль на несколько файлов в Typescript с помощью node.js

Кажется, что информация о том, как на самом деле структурировать код при записи Typescript, находится рядом с несуществующим.

Я хочу сделать сервер в node. Он имеет внешние зависимости, такие как socket.io. Сервер будет слишком большой, чтобы поместить все это в один файл (как я полагаю, в большинстве случаев), поэтому я решил, что я разделил его. Я хочу, чтобы каждый класс был в отдельном файле, и я хочу, чтобы иметь возможность использовать их во всем проекте без необходимости делать что-то безумное, например

import vector = require("vector.ts");
var vec = new vector.Vector();

Как мне это сделать? Пока кажется, что я сражаюсь на двух фронтах. Когда я получаю tsc для компиляции, node жалуется на время выполнения, но когда я изменяю код так, чтобы node работал, он не компилируется.

Буду признателен, если кто-то сможет потратить время, чтобы пройти этот шаг за шагом.

4b9b3361

Ответ 1

На самом деле вы можете (теперь):

file: class1.ts:

export class Class1 {
  name: string;

  constructor(name: string){
      this.name = name;
  }
}

file: class2.ts:

export class Class2 {
    name: string;
}

файл консолидирующего модуля: classes.ts:

export { Class1 } from "./class1";
export { Class2 } from "./class2";

потребительский файл:

import { Class1, Class2 } from "./classes";

let c1 = new Class1("Herbert");
let c2 = new Class2();

Таким образом, вы можете иметь один класс (или интерфейс) для каждого файла. В одном файле консолидирующего модуля (classes.ts) вы ссылаетесь на все сущности, составляющие ваш "модуль".

Теперь вам нужно только ссылаться (импортировать) на файл с одним модулем для доступа ко всем вашим классам. У вас все еще есть аккуратная сортировка между файлами.

Надеюсь, это поможет любому, кто все еще смотрит.

Ответ 2

В TypeScript еще не поддерживаются внешние внешние файлы с несколькими файлами.

Для рекомендаций по структурированию модулей эта страница имеет хорошее изложение вариантов. В частности, если у вас есть только один класс для каждого файла, вы можете использовать export =, чтобы вторая строка кода в вашем примере просто была var vec = new vector();, что было бы достаточно простым.

Ответ 3

Для тех, кто наткнулся на эту ветку (как я), кто пытается создать один файл барреля для объявлений внешнего модуля, ответ loretoparisi - путь. Вот мой пример использования с примерами модулей. Я хотел иметь файл декларации ствола (index.d.ts) для всех моих сторонних деклараций, которые я писал, но не хотел помещать его в декларации 6+ модулей в одном файле. Так вот что я сделал.

У меня есть такая структура папок:

src/ 
  index.ts

Пример index.ts:

import WildEmitter from 'wildemitter';
import SomethingCool from 'somethingcool';

// ... rest of file

Я преобразовал структуру папок следующим образом, чтобы записать файлы объявлений для своих импортированных сторонних модулей:

src/ 
  index.ts
  /types
    index.d.ts
    /modules
      wildemitter.d.ts
      somethingcool.d.ts

В моем файле src/types/index.d.ts есть:

/// <reference path="modules/wildemitter.d.ts" />
/// <reference path="modules/somethingcool.d.ts" />

Тогда я могу хранить объявления своих модулей в отдельных файлах.

В src/types/modules/wildemitter.d.ts у меня есть:

declare module 'wildemitter' {
  // declarations
}

Надеюсь, это кому-нибудь поможет!