注册

如何在TS里使用命名空间,来组织你的代码

前言


关于命名空间,官方有个说明,大概是这么个意思:


为了与ECMAScript 2015里的术语保持一致,从TypeScript 1.5开始,“外部模块”称为“模块”,而“内部模块”称做“命名空间”。


为了避免新的使用者被相似的名称所迷惑,建议:



任何使用 module关键字来声明一个内部模块的地方都应该使用namespace关键字来替换



具体的使用下面会讲到


使用命名空间


使用命名空间的方式,其实非常简单,格式如下:


namespace X {}

具体的使用可以看看下面这个例子(例子来源TS官方文档)


我们定义几个简单的字符串验证器,假设会使用它们来验证表单里的用户输入或验证外部数据


interface StringValidator {
isAcceptable(s: string): boolean;
}

let lettersRegexp = /^[A-Za-z]+$/;
let numberRegexp = /^[0-9]+$/;

class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}

class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}

// Some samples to try
let strings = ["Hello", "98052", "101"];

// Validators to use
let validators: { [s: string]: StringValidator; } = {};
validators["ZIP code"] = new ZipCodeValidator();
validators["Letters only"] = new LettersOnlyValidator();

// Show whether each string passed each validator
for (let s of strings) {
for (let name in validators) {
let isMatch = validators[name].isAcceptable(s);
console.log(`'${ s }' ${ isMatch ? "matches" : "does not match" } '${ name }'.`);
}
}

现在我们是把所有的验证器都放在一个文件里


但是,随着更多验证器的加入,我们可能会担心与其它对象产生命名冲突。因此我们使用命名空间来组织我们的代码


如下使用命名空间:


namespace Validation {
export interface StringValidator {
isAcceptable(s: string): boolean;
}

const lettersRegexp = /^[A-Za-z]+$/;
const numberRegexp = /^[0-9]+$/;

export class LettersOnlyValidator implements StringValidator {
isAcceptable(s: string) {
return lettersRegexp.test(s);
}
}

export class ZipCodeValidator implements StringValidator {
isAcceptable(s: string) {
return s.length === 5 && numberRegexp.test(s);
}
}
}

// Some samples to try
let strings = ["Hello", "98052", "101"];

// Validators to use
let validators: { [s: string]: Validation.StringValidator; } = {};
validators["ZIP code"] = new Validation.ZipCodeValidator();
validators["Letters only"] = new Validation.LettersOnlyValidator();

// Show whether each string passed each validator
for (let s of strings) {
for (let name in validators) {
console.log(`"${ s }" - ${ validators[name].isAcceptable(s) ? "matches" : "does not match" } ${ name }`);
}
}

如上代码,把所有与验证器相关的类型都放到一个叫做Validation的命名空间里。 因为我们想让这些接口和类在命名空间之外也是可访问的,所以需要使用 export。 相反的,变量 lettersRegexpnumberRegexp是实现的细节,不需要导出,因此它们在命名空间外是不能访问的


有个问题是,如果只是一个文件,当应用变得越来越大的时候,会变得难以维护,因此我们根据需要,可选的将单文件分离到不同的文件中


下节我们会继续讲到这个问题,关于多文件的命名空间,并且我们会将上例中的单文件分割成多个文件。欢迎关注


END


以上就是本文的所有内容,如有问题,欢迎指正~


作者:LBJ
链接:https://juejin.cn/post/7031021973966684191

0 个评论

要回复文章请先登录注册