13. 命名空间namespace

TS系列72628 阅读0

namespace 用来建立一个容器,内部的所有变量和函数,都必须在这个容器里面使用。

namespace Utils {
function isString(value:any) {
return typeof value === 'string';
}

// 正确
isString('yes');
}

Utils.isString('no'); // 报错

上面示例中,命名空间Utils里面定义了一个函数isString(),它只能在Utils里面使用,如果用于外部就会报错。

如果要在命名空间以外使用内部成员,就必须为该成员加上export前缀,表示对外输出该成员。

namespace Utility {
export function log(msg:string) {
console.log(msg);
}
export function error(msg:string) {
console.error(msg);
}
}

Utility.log('Call me');
Utility.error('maybe!');

编译后命名空间Utility变成了 JavaScript 的一个对象,凡是export的内部成员,都成了该对象的属性。

这就是说,namespace 会变成一个值,保留在编译后的代码中。这一点要小心,它不是纯的类型代码。

namespace 可以嵌套。

namespace 本身也可以使用export命令输出,供其他文件使用。不过,更好的方法还是建议使用模块,采用模块的输出和输入。

多个同名的 namespace 会自动合并,这一点跟 interface 一样。这样做的目的是,如果同名的命名空间分布在不同的文件中,TypeScript 最终会将它们合并在一起。这样就比较方便扩展别人的代码。

合并命名空间时,命名空间中的非export的成员不会被合并,但是它们只能在各自的命名空间中使用。

命名空间还能与同名 Enum 合并。


如果 namespace 代码放在一个单独的文件里,那么引入这个文件需要使用三斜杠的语法

/// <reference path = "SomeFileName.ts" />

总结

namespace 与模块的作用是一致的,都是把相关代码组织在一起,对外输出接口。区别是一个文件只能有一个模块,但可以有多个 namespace。由于模块可以取代 namespace,而且是 JavaScript 的标准语法,还不需要编译转换,所以建议总是使用模块,替代 namespace。

评论

发表评论