全局空间
有一个 validator.ts 文件,内容如下:
const letterRegx = /^[a-zA-Z]+$/;
const numberRegx = /^[0-9]+$/;
interface StringValidator {
isAcceptable(s: string): boolean;
}
class LettersValidator implements StringValidator {
isAcceptable(s: string): boolean {
return letterRegx.test(s);
}
}
class ZipCodeValidator implements StringValidator {
isAcceptable(s: string): boolean {
return numberRegx.test(s);
}
}
复制代码
可以看到,validator.ts 文件 既没有导入也没有导出。因此,它不是一个自定义模块。它是位于全局空间下,它是位于全局空间下,它是位于全局空间下。
LettersValidator 是全局命名空间下的一个 class。在任何模块中都可以直接使用而不必再次引入。 有一个 main.ts 文件, 内容如下
export function main() {
new LettersValidator().isAcceptable('wuhan');
}
main();
复制代码
在 main.ts 中没有引入 LettersValidator。但是仍然可以直接使用 LettersValidator。原因就是 LettersValidator 是定义在全局空间下的类型。
模块空间
假设 在 validator.ts 尾部添加 export。
const letterRegx = /^[a-zA-Z]+$/;
const numberRegx = /^[0-9]+$/;
interface StringValidator {
isAcceptable(s: string): boolean;
}
class LettersValidator implements StringValidator {
isAcceptable(s: string): boolean {
return letterRegx.test(s);
}
}
class ZipCodeValidator implements StringValidator {
isAcceptable(s: string): boolean {
return numberRegx.test(s);
}
}
export {
StringValidator,
LettersValidator,
ZipCodeValidator,
}
复制代码
此时,validator.ts 是一个自定义模块,脱离了全局命名空间。在 main.ts 中要使用 LettersValidator 而不引入 LettersValidator 就会报错。因为,validator.ts 是一个模块,main.ts 也是一个模块。要想在一个模块中使用另一个模块中定义的类型,必须首先引入,然后才能够使用。