2015-08-13 3 views
20

Я начал работу над крупномасштабным проектом машинописного текста.Использование пространства имен, распространяемого по нескольким файлам в TypeScript

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

Я пытаюсь использовать модули/пространства имен и разделять классы на отдельные файлы для каждого из них, с папкой, содержащей пространство имен.

Структура файла:

app.ts 
    \Classes 
    ---- \Animals 
    ---- ---- Mammals.ts 
    ---- ---- Reptiles.ts 

Я затем попытаться импортировать все файлы в этом пространстве имен в app.ts используя что-то вроде: import * as Animals from "./Classes/Animals"

Что касается пространства имен самих файлов, я попытался следующий, не имела успеха:

namespace Animals { 
    export class Mammals { 
     constructor() { 
     } 
    } 
} 

, а также:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

К сожалению, путь никогда не распознается (поскольку он указывает на папку, а не на один файл). Возможно ли это? Наличие всех моих классов из одного пространства имен в одном файле приведет к созданию файлов длиной в тысячи строк и для этого проекта, который не поддерживается.

Я также заметил, что TypeScript 1.5 поддерживает tsconfig.json. Однако при необходимости добавить каждый файл вручную к карте - это верный способ введения проблем, когда разработчики начинают добавлять классы.

ПРИМЕЧАНИЕ. Я использую Visual Studio 2015, TypeScript 1.5 (я уверен, не уверен, как проверить). У меня также включена поддержка ES6.

Спасибо за рекомендации, которые вы можете дать!

+0

Официальный справочник охватывает это (хотя ут могут быть устаревшими) http://www.typescriptlang.org/Handbook#modules-splitting-across-files – pablochan

+0

Благодаря @pablochan - я видел, что один слишком , Ссылка на каждый файл в пространстве имен подобна интуитивному счетчику. Можно ли указывать на пространство имен, а не на отдельные файлы? – Askanison4

+0

Нет, если Visual Studio или какой-либо другой инструмент не поддерживают это. – pablochan

ответ

16

Использовать реэкспортирование для создания внешнего модуля t шляпа группы и выставляет типы из других модулей:

// Classes/Animals.ts 
export * from '.\Animals\Mammals'; 
export * from '.\Animals\Reptiles'; 

Затем импортировать типы из нового модуля, как обычно:

// app.ts 
import * as Animals from '.\Classes\Animals' 

let dog: Animals.Dog; 
let snake: Animals.Snake; 

Или

// app.ts 
import { Dog, Snake } from '.\Classes\Animals' 

let dog: Dog; 
let snake: Snake; 
+0

Большое спасибо, это работает безупречно – Laker

+0

Не работает ли это больше? Это именно то, что я хотел бы сделать, но я продолжаю получать «... млекопитающих.ts не является модулем « – DanielC

0

Внешние модули подразумевают, что вы загружаете файлы по файлу. И AMD, и CommonJS не имеют такой вещи, как пространство имен. Вы можете использовать некоторую постобработку для связывания файлов в одном модуле.


Следующая определяет внутренний модуль:

module Animals { 
    export class Reptiles { 
     constructor() { 
     } 
    } 
} 

Вы не должны использовать import для него. Animals.Reptiles видно везде. Единственная цель - загрузить скрипты в правильном порядке (например, базовые классы перед наследниками). Поэтому вы должны перечислить все файлы в ts.config или в другом месте. В моем проекте я использую пакеты в папках и соглашаюсь добавить @ в имена файлов базовых классов.

Другим решением является использование внешних модулей: AMD (RequireJS) или CommonJS (Browserify). В этом случае удалите верхний уровень module из декларации.Если один файл содержит только один тип вы можете экспортировать его в корень:

class Reptiles { 
    constructor() { 
    } 
} 

export = Reptiles; 

Вы можете обратиться модуль по пути к файлу:

import Reptilies = require('..\Animals\Reptilies') 
var reptile = new Reptile(); 

Или с новыми ES6 модулями:

export class Reptiles { 
    constructor() { 
    } 
} 

import { Reptiles } from '..\Animals\Reptilies'; 
+0

В этом случае, как мне импортировать пространство имен Animals? Если у меня есть пространство имен с 20 классами (все это будет использовано), мне может понадобиться одна ссылка. По крайней мере, так обстоит дело с другими языками. Кроме того, я заметил, что с поддержкой ES 6 код 'export = Reptiles; ', кажется, обескуражен, поскольку он не обновляется – Askanison4

4

нашел способ для достижения этой цели, но не с ключевым словом namespace.

  1. В "Животные" классы, Animal.ts & Mammal.ts & Reptile.ts под пространством имен.
  2. с индексом.ts для ствола.
  3. animals.ts для группировки пространств имен.

Animal namespace

Примеры Классы:

Classes

index.ts (как баррель)

enter image description here

animals.ts (для пространства имен группировки)

enter image description here

И здесь вы понимаете концепцию пространства имен.

enter image description here

+0

для меня это был правильный ответ, учитывая, что бочки на месте теперь могут иметь многоуровневые пространства имен, я искал что-то вроде api.Animals.Dog, и это позволило мне это сделать, однако это было даже лучше, если бы был способ использовать ключевое слово «namespace» в этом подходе –