在TypeScript中使用名称空间分布在多个文件中

aar*_*ond 31 javascript typescript typescript1.5

我已经开始研究大型打字稿项目了.

从一开始,我就想保持我的文件有条理(这个项目将在许多开发人员之间进行分配,因此订单非常必要).

我一直在尝试使用模块/命名空间并将类拆分为每个文件的单独文件,其中包含一个包含命名空间的文件夹.

文件结构是:

app.ts
\Classes
---- \Animals
---- ---- Mammals.ts
---- ---- Reptiles.ts
Run Code Online (Sandbox Code Playgroud)

然后,我尝试使用以下内容导入app.ts中该命名空间中的所有文件: import * as Animals from "./Classes/Animals"

至于命名空间文件本身,我尝试了以下方法,但没有成功:

namespace Animals {
    export class Mammals {
        constructor() {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

并且:

module Animals {
    export class Reptiles {
        constructor() {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,路径永远不会被识别(因为它指向文件夹而不是单个文件).这甚至可能吗?将来自单个命名空间的所有类放在一个文件中将导致文件长达数千行,并且该项目不可维护.

我还注意到TypeScript 1.5支持tsconfig.json - 但是,必须手动将每个文件添加到地图中是开发人员开始添加类时引入问题的可靠方法.

注意:我正在使用Visual Studio 2015,TypeScript 1.5(我相信,不知道如何验证).我也启用了ES6支持.

Vad*_*gon 27

使用重新导出来创建外部模块,该模块可以对来自其他模块的类型进行分组和公开:

// Classes/Animals.ts
export * from '.\Animals\Mammals';
export * from '.\Animals\Reptiles';
Run Code Online (Sandbox Code Playgroud)

然后照常从新模块导入类型:

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

let dog: Animals.Dog;
let snake: Animals.Snake;
Run Code Online (Sandbox Code Playgroud)

要么

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

let dog: Dog;
let snake: Snake;
Run Code Online (Sandbox Code Playgroud)

  • 这不再适用了吗?这正是我想要做的,但我一直得到"...... Mammals.ts不是一个模块" (5认同)

Val*_*Val 15

找到了实现目标但不使用namespace关键字的方法.

  1. 命名空间下的"Animals"类,Animal.ts和Mammal.ts&Reptile.ts.
  2. 与index.ts为桶.
  3. animals.ts用于命名空间分组.

动物命名空间

示例类:

类

index.ts(作为桶)

在此输入图像描述

animals.ts(用于名称空间分组)

在此输入图像描述

在这里,您将了解命名空间的概念.

在此输入图像描述

  • 对我来说,这是正确的答案,考虑到桶已就位,您现在可以拥有多层名称空间,我在寻找类似api.Animals.Dog之类的东西,这让我有了,但是如果有一个这种方法中使用“命名空间”关键字的方法 (3认同)

ktr*_*yak 5

如果您有自己的库并且想要从名称空间导出多个文件,您可以执行以下操作:

// classes/animals/mammals.ts
export enum Mammals {
  cow = 'cow',
  goat = 'goat',
}

// classes/animals/reptiles.ts
export interface Reptile {
  isOurOverlord: boolean;
}
export function isOurOverlord(specimen: Reptile) { ... } 

// classes/animals/index.ts
import * as mammals from './mammals';
import * as reptiles from './reptiles';
export { mammals, reptiles };

// classes/index.ts
import * as animals from './animals';
export { animals };

// app.ts
import { animals } from './classes';
const reptile: animals.reptiles.Reptile = {
  isOurOverlord: animals.reptiles.isOurOverlord(...),
}
Run Code Online (Sandbox Code Playgroud)

编辑:即,您不需要打字稿的命名空间即可在同一“命名空间”内使用animals.reptiles.Reptile类型和值的超级方便的语法。animals.mammals.Mammals