面试题答案
一键面试定义方式
- 模块:在TypeScript中,模块是通过文件来定义的,一个文件就是一个模块。模块内部的变量、函数、类等默认是私有的,通过
export
关键字来导出对外暴露的内容,如export const myVar = 10;
。导入模块使用import
关键字,例如import { myVar } from './myModule';
。 - 命名空间:使用
namespace
关键字定义,例如namespace MyNamespace { export const myValue = 42; }
。命名空间可以嵌套定义,在一个文件内可以有多个命名空间定义,并且可以通过/// <reference path="..."/>
指令引用其他命名空间定义的文件。
作用域
- 模块:每个模块都有自己独立的作用域,模块内定义的标识符不会与其他模块中的标识符冲突。模块之间通过导入导出进行交互,外部无法直接访问模块内部未导出的内容。
- 命名空间:命名空间在其定义的作用域内创建一个新的作用域,避免命名冲突。但如果多个命名空间在同一全局作用域下,需要注意命名空间名称不能冲突。命名空间内部的内容默认是私有的,通过
export
关键字暴露给外部使用。不过与模块不同,命名空间没有像模块那样严格的文件级隔离,多个命名空间定义可以合并。
使用场景
- 模块:适用于大型项目中实现代码的分离和复用,每个模块专注于特定的功能,便于维护和管理。在现代JavaScript开发中,无论是前端(如在React、Vue项目中)还是后端(如Node.js项目),模块都是组织代码的主要方式。例如,一个电商项目中可以将用户模块、商品模块、订单模块等分别定义为不同的模块。
- 命名空间:更适用于在较小的项目或特定场景下,对代码进行逻辑分组,避免全局作用域的命名冲突。例如,在一个包含多个工具函数的库中,可能使用命名空间将不同功能的工具函数分组,如
namespace MathUtils { export function add(a, b) { return a + b; } }
。但随着模块系统的广泛应用,命名空间的使用场景相对减少。