我是TypeScript的新手,我读的关于模块和命名空间的内容越多,它就越让我困惑。我应该使用模块吗?我应该使用命名空间吗?我应该同时使用吗?帮助!
我现有的javascript(.js)文件正在尝试转换为TypeScript。 有一个.js文件包含一些常规函数,一个.js文件包含一些特定于过滤器的函数。
现在我想用TypeScript组织这一点,就像我通常用C#做的那样。
这是正确的用法还是应该如何组织?
我不是在使用模块,不是吗? (工作原理)
Company.ts
namespace Company {
// nothing yet, but in future it might.
}
Company.Project.ts
namespace Company.Project {
import Company; // like this?
let myVar : string = "something";
export function handyGeneralFunction1(foo, bar) {
// ...
}
export function handyGeneralFunction2(foo, bar, foo, bar) {
// ...
doInternalCalc();
// ...
}
export function handyGeneralFunction3() {
// ...
}
function doInternalCalc() {
// ...
}
}
Company.Project.Filter.ts
namespace Company.Project.Filter {
import Project = Company.Project; // like this?
export function initializeFilter() {
// ...
initMetadata();
// ...
}
function initMetadata() {
// ...
Project.handyGeneralFunction3();
let helper : FilterHelper = new FilterHelper("aaaa,bbbb");
let res:string[] = helper.parseData();
}
function foo() {
// ...
let x :string = Project.myVar + " else"; // can I use myVar here?
}
// a class in the namespace
export class FilterHelper {
data: string;
constructor(theData: string) {
this.data = theData;
}
parseData() : string[] {
// ...
return new Array<string>();
}
}
}
答案 0 :(得分:2)
如果你有可能真正改进项目结构,你肯定应该使用模块而不是命名空间。根据项目的规模,这可能需要一些努力。
如果您的应用程序不是那么大并且您不想投资转换到可以处理实际模块的不同构建系统,那么引入命名空间可能很有用。使用命名空间并不比包含函数和变量的某些命名全局变量多得多。由于您没有任何适当的依赖结构,这很快就会变得混乱。您需要注意以正确的顺序导入所有文件以使命名空间正常工作。您使用的导入语法甚至可以省略,因为您无论如何只引用另一个需要在该时间点初始化的全局对象。
因此,如果您无法对代码库进行任何更大的更改,那么命名空间可能是您迈出的第一步。对于面向未来的设置,我肯定会建议使用真正的模块。但请注意,这并非免费。
有关详细信息,我建议您查看https://www.typescriptlang.org/docs/handbook/namespaces-and-modules.html上的官方评论或https://basarat.gitbooks.io/typescript/content/docs/project/namespaces.html
中TypeScript Deep Dive中的部分。