TypeScript在前端项目的渐进式采用策略

简介: 该文介绍了渐进式采用TypeScript在前端项目中的策略。首先,通过将JS文件扩展名改为TS并添加类型注解,如在`utils.js`中添加类型。接着,配置`tsconfig.json`,包括目标版本、模块系统、输出目录等。高级配置涉及路径别名、JSON导入、库文件等。然后,集成TypeScript到构建流程,如Webpack,安装`ts-loader`并调整配置。利用类型定义,包括安装第三方库的类型定义包,自定义类型定义或使用社区定义。最后,逐步迁移其他模块至TypeScript,强化类型检查,并确保IDE支持。

渐进式采用 TypeScript 在前端项目中的策略通常包括:

引入TypeScript

如果我们有一个简单的JavaScript模块utils.js,它包含一个函数用于计算两数之和:

// utils.js
export function add(a, b) {
   
  return a + b;
}

首先,我们将文件扩展名改为.ts,并开始逐步添加类型注解:

// utils.ts
export function add(a: number, b: number): number {
   
  return a + b;
}

设置tsconfig.json

在项目根目录下创建tsconfig.json来配置TypeScript编译器:

{
   
  // 指定编译的目标ECMAScript版本
  "target": "es6",

  // 指定模块系统
  "module": "esnext",

  // 输出目录,编译后的文件存放位置
  "outDir": "./dist",

  // 是否包含源码映射文件,方便调试
  "sourceMap": true,

  // 启用严格的类型检查选项
  "strict": true,

  // 允许从没有设置默认导出的模块中默认导入
  "esModuleInterop": true,

  // 忽略库的类型检查
  "skipLibCheck": true,

  // 确保文件名大小写一致
  "forceConsistentCasingInFileNames": true,

  // 包含哪些文件进行编译
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx" // 如果项目中使用了TypeScript的JSX
  ],

  // 排除哪些文件或目录不进行编译
  "exclude": [
    "node_modules",
    "**/*.spec.ts" // 排除测试文件
  ]
}

高级配置项

paths: 用于路径别名配置,方便模块导入时的路径管理。

  "paths": {
   
    "@components/*": ["src/components/*"]
  }

baseUrl: 设置项目的基础目录,与paths一起使用时,可以提供更简洁的导入路径。

  "baseUrl": "./src"

resolveJsonModule: 允许直接导入JSON文件。

  "resolveJsonModule": true

lib: 指定项目中使用的库文件集合,比如ECMAScript、DOM等。

  "lib": ["es6", "dom"]

jsx: 如果项目使用了JSX语法,需要设置此选项。

  "jsx": "react-jsx"

继承配置

如果你的项目结构比较复杂,可能需要在不同的目录下有不同的配置,可以使用extends属性来继承一个基础的tsconfig.json:

// 在子目录下的tsconfig.app.json
{
   
  "extends": "../tsconfig.json",
  "compilerOptions": {
   
    // 在这里可以覆盖或添加特定于应用程序的编译选项
  },
  // 可以在这里添加或修改include和exclude
}

集成TypeScript到构建流程

集成TypeScript到构建流程通常涉及到调整构建工具(如Webpack、Rollup或Parcel)的配置。并在配置文件中添加TypeScript处理规则。

npm install --save-dev typescript ts-loader webpack webpack-cli

webpack.config.js配置文件

const path = require('path');

module.exports = {
   
  entry: './src/index.ts', // 你的入口文件,通常是index.ts
  output: {
   
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'dist'),
  },
  resolve: {
   
    extensions: ['.ts', '.tsx', '.js', '.jsx'], // 添加.ts和.tsx扩展名
  },
  module: {
   
    rules: [
      {
   
        test: /\.tsx?$/,
        use: 'ts-loader',
        exclude: /node_modules/, // 排除node_modules目录
      },
    ],
  },
  devtool: 'source-map', // 生成source map,便于开发时调试
};

tsconfig.json中,确保已经配置了正确的outDir,以匹配Webpack的输出目录:

{
   
  // ...
  "outDir": "./dist",
  // ...
}

现在,你可以在命令行中运行以下命令来启动构建流程:

npx webpack

这将使用Webpackts-loaderTypeScript源代码编译为JavaScript,并输出到dist目录。

如果你使用的是npm scripts,可以在package.json中添加构建脚本:

{
   
  "scripts": {
   
    "build": "webpack"
  }
}

然后通过npm run build运行构建。

利用类型定义

如果项目中使用到了第三方库,确保安装对应的类型定义包,如@types/lodash。对于没有官方类型定义的库,可以尝试社区提供的定义或自己编写声明文件。

1.安装类型定义包:

大多数流行库都有对应的类型定义包,通常位于@types命名空间下。例如,如果你的项目中使用了lodash,可以运行以下命令安装其类型定义:

   npm install --save-dev @types/lodash

或者使用Yarn

   yarn add --dev @types/lodash

2. 自动类型推断

安装完类型定义后,TypeScript编译器会自动识别并使用这些类型定义。你无需在代码中显式引入它们,只要在项目中正常引用库即可。

3. 自定义类型定义

如果你使用了一个没有官方类型定义的库,或者官方类型定义不够完整,你可以自己编写类型声明文件(.d.ts)。通常,这个文件应放在与库的JavaScript文件相同的位置,或者放在types或@types目录下。

例如,假设有一个名为customLib的库,其主文件为customLib.js,你可以创建一个customLib.d.ts文件来声明其类型:

   declare module 'customLib' {
   
     export function doSomething(data: string): void;
     export interface CustomInterface {
   
       property: number;
     }
   }

然后在你的代码中,TypeScript会识别并使用这些类型。

4. 社区类型定义

有时,社区会提供非官方的类型定义。你可以在DefinitelyTyped仓库(https://github.com/DefinitelyTyped/DefinitelyTyped)中查找,或者在GitHub上搜索`@types/library-name`。

5. 类型定义的局限性

虽然类型定义对提高代码质量很有帮助,但并非所有库都提供完整的类型定义,或者可能与库的实际行为不完全匹配。在这种情况下,你可能需要在代码中使用any类型或// @ts-ignore注释来跳过特定的类型检查。

IDE集成

确保你的IDE(如VSCode)安装了TypeScript插件,以便获得代码补全、类型检查等功能。

逐步迁移其他模块

随着时间推移,可以逐步将其他JavaScript模块转换为TypeScript。例如,假设有一个app.js,可以类似地转换为app.ts并添加类型注解。

  • 将app.js重命名为app.ts。这一步标志着该模块正式进入TypeScript环境。

  • 打开app.ts,开始逐步为变量、函数参数、返回值等添加类型注解。这有助于TypeScript编译器进行类型检查,减少潜在的类型错误。

  // JavaScript
  function fetchData(url) {
   
    return fetch(url).then(response => response.json());
  }

  // 转换为TypeScript
  async function fetchData(url: string): Promise<any> {
   
    const response = await fetch(url);
    return response.json();
  }
  • 对于复杂的数据结构,考虑使用接口(interface)或类型别名(type alias)来定义类型,提高代码的可读性和可维护性。
  interface User {
   
    id: number;
    name: string;
    email: string;
  }

  function getUser(): User {
   
    // ...
  }

强化类型检查

在团队适应TypeScript后,可以在tsconfig.json中逐步开启更严格的类型检查选项,如strictNullChecks

2500G计算机入门到高级架构师开发资料超级大礼包免费送!

相关文章
|
5天前
|
JSON 前端开发 API
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
29 5
以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
|
14天前
|
Dart 前端开发 Android开发
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
37 4
【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
16天前
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
121 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
24天前
|
Dart 前端开发 容器
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
75 18
【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
26天前
|
缓存 前端开发 IDE
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
27 0
【06】flutter完成注册页面-密码登录-手机短信验证-找回密码相关页面-并且实现静态跳转打包demo做演示-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
27天前
|
Dart 前端开发
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
116 75
【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
29天前
|
缓存 前端开发 Android开发
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
79 12
【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
|
1月前
|
前端开发 Java 开发工具
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
81 18
【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
|
1月前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
36 1
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
2月前
|
前端开发 JavaScript 开发者
前端项目代码规范工具 (ESLint. Prettier. Stylelint. TypeScript)
前端项目代码规范工具 (ESLint. Prettier. Stylelint. TypeScript)
162 4

热门文章

最新文章

  • 1
    TypeScript-内置应用程序类型-Recode
  • 2
    Gzm Design:开源神器!用 Vue3、Vite4、TypeScript 革新海报设计,免费开源的海报设计器,主流技术打造,轻松高效
  • 3
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 4
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 5
    【05】flutter完成注册页面完善样式bug-增加自定义可复用组件widgets-严格规划文件和目录结构-规范入口文件-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 6
    详解智能编码在前端研发的创新应用
  • 7
    巧用通义灵码,提升前端研发效率
  • 8
    智能编码在前端研发的创新应用
  • 9
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 1
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    29
  • 2
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    51
  • 3
    【2025优雅草开源计划进行中01】-针对web前端开发初学者使用-优雅草科技官网-纯静态页面html+css+JavaScript可直接下载使用-开源-首页为优雅草吴银满工程师原创-优雅草卓伊凡发布
    26
  • 4
    巧用通义灵码,提升前端研发效率
    93
  • 5
    【11】flutter进行了聊天页面的开发-增加了即时通讯聊天的整体页面和组件-切换-朋友-陌生人-vip开通详细页面-即时通讯sdk准备-直播sdk准备-即时通讯有无UI集成的区别介绍-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    141
  • 6
    详解智能编码在前端研发的创新应用
    96
  • 7
    智能编码在前端研发的创新应用
    83
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    37
  • 9
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
    121
  • 10
    【07】flutter完成主页-完成底部菜单栏并且做自定义组件-完整短视频仿抖音上下滑动页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
    75