javascript - Utilizarea unui namespace răspândit pe mai multe fișiere de modul în TypeScript


Am început să lucrez la un proiect TypeScript de scară mare.

De la început, vreau să îmi țin fișierele organizate (acest proiect va fi împărțit între mulți dezvoltatori, așa că ordinea este foarte necesară).

Am încercat să folosesc module/spații de nume și să separ clasele în fișiere distincte pentru fiecare, având un folder care conține spațiul de nume.

Structura fișierului este:

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

Apoi încerc să import toate fișierele din acel namespace în app.ts folosind ceva de genul: import * as Animals from "./Classes/Animals"

În ceea ce privește fișierele namespace-ului în sine, am încercat următoarele, fără succes:

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

și, de asemenea:

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

Din păcate, calea nu este niciodată recunoscută (deoarece indică un folder și nu un singur fișier). Este acest lucru chiar posibil? Având toate clasele mele dintr-un singur spațiu de nume într-un singur fișier va rezulta fișiere de mii de linii și pentru acest proiect acest lucru nu este sustenabil.

Am observat, de asemenea, că TypeScript 1.5 are suport pentru tsconfig.json - totuși, a fi nevoit să adaugi fiecare fișier manual în mapă este o modalitate sigură de a introduce probleme atunci când dezvoltatorii încep să adauge clase.

NOTĂ: Folosesc Visual Studio 2015, TypeScript 1.5 (cred, nu sunt sigur cum să verific). De asemenea, am activat suportul pentru ES6.

Răspuns #1

Folosește reexportarea pentru a crea un modul extern care grupează și expune tipurile din alte module:

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

Apoi importă tipurile din noul modul ca de obicei:

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

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

Sau

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

let dog: Dog;
let snake: Snake;

Răspunsul #2

Am găsit o modalitate de a-ți atinge obiectivul, dar nu cu cuvântul cheie namespace.

  1. Clasele „Animals”, Animal.ts & Mammal.ts & Reptile.ts sub namespace.
  2. cu index.ts pentru baril.
  3. animals.ts pentru gruparea spațiului de nume.

Clase de exemplu:

index.ts (ca baril)

animals.ts (pentru gruparea în namespace-uri)

Și iată conceptul de spațiu de nume.