TypeScript在前端项目的渐进式采用策略
渐进式采用 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.tsoutput: {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
这将使用Webpack和ts-loader将TypeScript源代码编译为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编译器进行类型检查,减少潜在的类型错误。
// JavaScriptfunction fetchData(url) {return fetch(url).then(response => response.json());}// 转换为TypeScriptasync 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计算机入门到高级架构师开发资料超级大礼包免费送!
相关文章:
TypeScript在前端项目的渐进式采用策略
渐进式采用 TypeScript 在前端项目中的策略通常包括: 引入TypeScript 如果我们有一个简单的JavaScript模块utils.js,它包含一个函数用于计算两数之和: // utils.js export function add(a, b) {return a b; }首先,我们将文件扩展名改为.t…...
C++容器常用集合(附传送门)
C常用的容器: string容器 C容器——string-CSDN博客 储存字符串的 vector容器 C容器——vector-CSDN博客 向量是动态数组,可以自动扩展以容纳更多元素。 插入和删除元素的时间复杂度取决于操作的位置 tuple容器(元组) C容器…...
基于springboot的校园资料分享平台源码数据库
基于springboot的校园资料分享平台源码数据库 随着信息互联网购物的飞速发展,国内放开了自媒体的政策,一般企业都开始开发属于自己内容分发平台的网站。本文介绍了校园资料分享平台的开发全过程。通过分析企业对于校园资料分享平台的需求,创…...
卷积神经网络(CNN)
大家好,这里是七七,今天来更新关于CNN相关的内容同了。本文是针对CNN原理的说明,但对于小白不是非常友好,建议先掌握神经网络相应知识再进行阅读哦。 一、卷积与互相关 卷积 卷积运算是对两个函数进行的一种数学运算,…...
Linux入门攻坚——22、通信安全基础知识及openssl、CA证书
Linux系统常用的加解密工具:OpenSSL,gpg(是pgp的实现) 加密算法和协议: 对称加密:加解密使用同一个秘钥; DES:Data Encryption Standard,数据加密标准&…...
无障碍Web开发:遵循WCAG标准构建包容性用户体验
无障碍Web开发旨在确保所有用户,无论其身体条件或能力如何,都能轻松、有效地访问和使用Web内容。遵循Web Content Accessibility Guidelines (WCAG) 标准是实现这一目标的关键。以下是一些基于WCAG标准的无障碍Web开发实践,以构建更具包容性的…...
Isaac Sim 3(学习笔记5.8)
Isaac Sim 利用深度学习获取mask掩码图 参考内容 Kubernetes官网 在 Linux 系统中安装并设置 kubectl | Kubernetes准备开始 kubectl 版本和集群版本之间的差异必须在一个小版本号内。 例如:v1.30 版本的客户端能与 v1.29、 v1.30 和 v1.31 版本的控制面通信。 用…...
对象定义成final类型还能改变吗
如果一个Java对象被定义为final类型,那么它的引用不能被改变,但是对象本身的状态仍然可以被修改。这意味着你可以改变final对象的属性,但是不能将其引用指向另一个对象。 例如,下面的代码中,虽然person对象被声明为fi…...
Vue Router 路由hash和history模式
文章目录 hash和history模式区别Hash 模式History 模式 在 Vue 中,路由的两种主要模式是 hash 和 history,默认的路由模式是hash模式。。这两种模式决定了 URL 的外观以及浏览器如何处理 URL 的变化。 hash和history模式区别 特性Hash 模式History 模…...
【xrframe】优化ar相机中加载模型效果
方法一:定义渲染width和height //组件生命周期:在视图层布局完成后执行ready() {const info wx.getSystemInfoSync();//在小程序中同步获取系统信息const width info.windowWidth;//获取屏幕的宽度(单位为物理像素)const heigh…...
解决 SyntaxError: Unexpected token ‘.‘ 报错问题
这个报错一般是编译问题,浏览器的版本过低没通过代码 解决办法: 在package.json文件中加上这个 "browserslist": ["> 1%","last 2 versions","not dead","not ie < 6","Android > 4&…...
谷歌插件V3知识点
1.background.js与content.js与popup.js对比: background.js 生命周期:一开始就执行,最早执行且一直执行; 作用:放置全局的、需要一直运行的代码,权限非常高几乎调用所有Chrome api,还可以发起跨域请求; content.js 生…...
webrtc windows 编译,以及peerconnection_client
webrtc windows环境编译,主要参考webrtc官方文档,自备梯子 depot tools 安装 Install depot_tools 因为我用的是windows,这里下载bundle 的安装包,然后直接解压,最后设置到环境变量PATH。 执行gn等命令不报错&…...
geotrust企业通配符证书2990
随着时代的变化,人们获取信息的方式由报纸、书籍变为手机、电脑,因此很多企事业单位用户开始在互联网中创建网站来进行宣传,吸引客户。为了维护网站安全环境,保护客户数据,企事业单位也开始使用SSL数字证书,…...
网络安全科普:保护你的数字生活
# 网络安全科普:保护你的数字生活 ## 引言 在数字化时代,网络安全已成为每个人都必须面对的问题。从个人隐私保护到金融交易安全,网络的安全性直接关系到我们的日常生活。因此,普及网络安全知识,提高公众的网络安全意…...
Java实战:递归查找指定后缀名的文件
在日常的软件开发中,经常需要处理文件操作。假设我们有一个需求:从一个包含大量JSON文件的文件夹中提取出所有的JSON文件以进行进一步处理。本文将介绍如何利用Java编写一个高效的方法来递归查找指定后缀名的文件。 代码实现: import java.i…...
Linux 操作系统网络编程1
目录 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型 1.1.2 网络数据传输过程 2 传输层通信协议 2.1 TCP 2.1.1 TCP的3次握手过程 2.1.2 TCP四次挥手过程 2.2 UDP 3 网络编程的IP地址 4 端口 5 套接字 1、网络编程 1.1 OSI 网络七层模型 1.1.1 OSI 参考模型…...
future wait_for()成员、shared_future
future wait_for()成员 wait_for():等待其异步操作操作完成或者超出等待,用于检查异步操作的状态。wait_for()可以接受一个std::chrono::duration类型的参数,它表示等待的最大时间,会返回一个std::future_status枚举值࿰…...
C++ list介绍(迭代器失效)
一、常用接口 reverse逆置 sort排序(默认升序) 仿函数greater<int> merge合并,可以全部合并,也可以一部分合并 unique:去重(先排序,再去重) remove:删除e值&#…...
codeforces 1809C
很巧妙的构造 题目链接 题目大意 要求构造长度为 n n n的数组满足以下条件 任意 i i i, − 1000 < a [ i ] < 1000 -1000<a[i]<1000 −1000<a[i]<1000有 k k k个和为正数的子串其余子串和为负数 思路 我们发现与子数组内元素的和有关&…...
Midjourney快速模式 vs 标准模式实测对比:27组图像生成数据、GPU资源占用率与成本折算表(限时公开)
更多请点击: https://codechina.net 第一章:Midjourney快速模式与标准模式的核心差异解析 Midjourney 的快速模式(Relaxed Mode)与标准模式(Turbo/Standard Mode)在资源调度、生成质量、排队机制及计费逻辑…...
ATxmega时钟与GPIO配置详解:从原理到实战调试
1. 项目概述:从零认识ATxmage的时钟与GPIO最近在捣鼓一块ATxmage的开发板,很多刚入门的朋友拿到手,面对密密麻麻的引脚和一堆陌生的寄存器,往往不知道从哪里下手。其实,玩转任何一款微控制器,最核心、最基础…...
如何彻底解决IDM激活问题:开源脚本终极指南
如何彻底解决IDM激活问题:开源脚本终极指南 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager激活弹窗困扰着无数用户&#…...
别让“AI味”代码毁了你的项目:一份AI生成代码的质量评估与防御指南
别让“AI味”代码毁了你的项目:一份AI生成代码的质量评估与防御指南 前段时间,团队里一个新人在周会上展示了他用 AI 辅助完成的一个支付模块。代码跑通了,测试用例全绿,乍一看没什么问题。但我顺手点开一个 Service 层方法&#…...
在RK3568 Android 11上搞定移远EC20 4G模块:从驱动到RIL的完整移植避坑记录
RK3568 Android 11平台EC20 4G模块全流程移植指南:从硬件连接到网络配置 在嵌入式Android开发中,4G模块的集成一直是项目落地的关键环节。本文将基于RK3568平台和Android 11系统,详细解析移远EC20模块从硬件连接到上层应用的全链路移植过程。…...
OpenStack部署避坑实录:从网络不通到Dashboard白屏,我踩过的那些‘坑’及解决办法
OpenStack部署避坑指南:从时间同步到Dashboard白屏的实战解决方案 部署OpenStack云平台时,即使按照官方文档一步步操作,也难免会遇到各种"坑"。本文将分享我在实际部署过程中遇到的五个典型问题及其解决方案,帮助你在遇…...
如何高效设计无刷直流电机控制器:Simscape Electrical完整解决方案指南
如何高效设计无刷直流电机控制器:Simscape Electrical完整解决方案指南 【免费下载链接】Design-motor-controllers-with-Simscape-Electrical This repository contains MATLAB and Simulink files used in the "How to design motor controllers using Simsc…...
5步掌握BG3SE:让《博德之门3》成为你的创意画布
5步掌握BG3SE:让《博德之门3》成为你的创意画布 【免费下载链接】bg3se Baldurs Gate 3 Script Extender 项目地址: https://gitcode.com/gh_mirrors/bg/bg3se BG3SE(博德之门3脚本扩展器) 是一款革命性的开源工具,它通过L…...
挤馅机性价比选择:企业采购决策关键因素深度解析
挤馅机性价比选择:企业采购决策关键因素深度解析“选挤馅机只看价格?错!挤馅机性价比的核心是‘长期使用成本’而非‘单次采购价’”企业采购挤馅机时,常陷入“价格越低越划算”的误区,却忽略了后期维护、产能波动等隐…...
自动化 Vue 3 转 React 编译工具 VuReact 连续迭代,全量编译速度提升 30%-40%
近期,自动化 Vue 3 转 React 编译工具 VuReact 完成 v1.8.0、v1.8.1、v1.8.3 连续迭代,围绕性能、稳定性、开发体验深度优化,降低 Vue 项目向 React 迁移门槛。更新聚焦三大方向本轮更新围绕性能、稳定性、开发体验三大方向进行深度优化。尤其…...
