面试题答案
一键面试模块划分与封装
- 使用命名空间模块(内部模块):在 TypeScript 早期,命名空间模块用于组织代码,防止全局变量污染。虽然现在推荐使用 ES 模块,但对于内部逻辑封装仍有帮助。
// 定义一个命名空间模块 namespace PluginUtils { // 内部敏感模块,使用 private 类似的方式(闭包)隐藏 const sensitiveFunction = () => { console.log('This is a sensitive function'); }; // 对外公开的函数 export const publicFunction = () => { // 调用内部敏感函数 sensitiveFunction(); console.log('This is a public function'); }; } // 使用命名空间模块中的公开函数 PluginUtils.publicFunction();
- 使用 ES 模块:现代 TypeScript 项目广泛使用 ES 模块来划分功能。
- 定义模块文件:
// mathUtils.ts // 内部函数,不导出 const addInternal = (a: number, b: number) => a + b; // 公开函数 export const add = (a: number, b: number) => { return addInternal(a, b); };
- 导入和使用模块:
// main.ts import { add } from './mathUtils'; console.log(add(1, 2));
- 定义模块文件:
防止外部非法访问内部敏感模块
- 不导出敏感模块:在 ES 模块中,只要不使用
export
关键字将模块成员导出,外部就无法访问。例如在上面的mathUtils.ts
中,addInternal
函数没有导出,外部就无法直接调用。 - 使用闭包:对于命名空间模块或自执行函数,使用闭包来隐藏内部变量和函数。例如在
PluginUtils
命名空间中,sensitiveFunction
定义在闭包内,外部无法直接访问。
模块间依赖管理和导出策略
- 依赖管理:
- ES 模块:使用
import
关键字明确指定依赖。例如在main.ts
中import { add } from './mathUtils';
,这样清晰地表明了main.ts
依赖mathUtils.ts
中的add
函数。 - 相对路径和绝对路径:在 TypeScript 中,导入模块可以使用相对路径(如
./mathUtils
),适用于同一项目内模块间依赖;也可以使用绝对路径(如@myorg/utils
),常用于配置了路径映射的大型项目,方便管理依赖。
- ES 模块:使用
- 导出策略:
- 按需导出:如
mathUtils.ts
中,只导出需要公开的add
函数,这样可以严格控制外部对模块的访问,提高安全性。 - 默认导出:
// greeting.ts const greeting = 'Hello, world!'; export default greeting;
// main.ts import msg from './greeting'; console.log(msg);
- 按需导出:如