面试题答案
一键面试编译配置
- TypeScript 编译选项:
- 在
tsconfig.json
中,确保module
选项设置为esnext
,这样TypeScript 名字空间代码可以与 ES6 模块更好地兼容。例如:
{ "compilerOptions": { "module": "esnext", "target": "es6", "strict": true } }
- 设置
esModuleInterop
为true
,以允许 TypeScript 正确处理 ES6 模块导入和导出,特别是在与名字空间代码交互时。例如:
{ "compilerOptions": { "esModuleInterop": true } }
- 在
- Webpack 配置:
- 使用
ts-loader
处理 TypeScript 代码。在webpack.config.js
中添加如下规则:
module.exports = { module: { rules: [ { test: /\.tsx?$/, use: 'ts-loader', exclude: /node_modules/ } ] } };
- 配置
webpack - merge
等工具,以便可以灵活地合并不同环境(开发、生产等)的 Webpack 配置,同时处理 TypeScript 名字空间和 ES6 模块代码。
- 使用
依赖管理
- npm 或 yarn:统一使用
npm
或yarn
管理项目依赖。无论是基于名字空间的 TypeScript 代码依赖,还是 ES6 模块部分的依赖,都在package.json
中进行管理。例如,安装lodash
依赖,无论是哪个部分使用,都通过npm install lodash
或yarn add lodash
进行安装。 - 别名配置:在 Webpack 中使用
@
等别名来简化模块导入路径,方便在不同代码组织方式下引用模块。在webpack.config.js
中配置:
这样无论是 TypeScript 名字空间代码还是 ES6 模块代码,都可以使用const path = require('path'); module.exports = { resolve: { alias: { '@': path.resolve(__dirname, 'src') } } };
import { someFunction } from '@/utils/someUtils';
这种方式导入模块,增强代码的可维护性。
代码结构
- 目录划分:保持清晰的目录结构,例如将基于 TypeScript 名字空间的代码放在
src/namespace
目录下,基于 ES6 模块的代码放在src/esm
目录下。在src
目录下还可以有共享的utils
、components
等目录,这些目录下的代码可以根据需要采用合适的模块组织方式。 - 接口和类型定义:对于共享的接口和类型定义,可以放在单独的
types
目录下,并且使用 ES6 模块导出。这样无论是 TypeScript 名字空间代码还是 ES6 模块代码都可以方便地导入使用。例如:- 在
types/user.ts
中:
export interface User { name: string; age: number; }
- 在 TypeScript 名字空间代码中可以这样导入:
import { User } from '../types/user'; namespace MyNamespace { export function processUser(user: User) { // 处理用户逻辑 } }
- 在 ES6 模块代码中可以这样导入:
import { User } from '../types/user'; export function displayUser(user: User) { // 显示用户逻辑 }
- 在
- 避免重复代码:通过提取公共逻辑到共享模块中,无论是以 ES6 模块还是 TypeScript 名字空间内的函数形式,确保代码复用,减少冗余。例如,将一些通用的工具函数放在
src/utils/commonUtils.ts
中,以 ES6 模块导出,两边都可以导入使用。