全局空间和模块空间之间的转化

全局空间

有一个 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 也是一个模块。要想在一个模块中使用另一个模块中定义的类型,必须首先引入,然后才能够使用。

猜你喜欢

转载自juejin.im/post/7040668567402414087