神器!快速将JavaScript迁移到TypeScript

简介: 神器!快速将JavaScript迁移到TypeScript

如今,越来越多的项目将 JavaScript 代码迁移到 TypeScript,因为它是一种静态类型语言,能够提高项目的可读性、可维护性和健壮性。然而,大规模迁移是一项复杂的任务,从 JavaScript 迁移到 TypeScript 有两种选择:

(1)混合迁移: 逐个文件迁移,修复类型错误,然后重复,直到迁移完整项目。allowJS 配置选项允许 TypeScript 和 JavaScript文件同时存于项目中,这使得这种方法成为可能!在混合迁移策略中,不必暂停开发,可以逐个文件逐步迁移。虽然,在大规模项目上,这个过程可能需要很长时间。

(2) 整体迁移: 将 JavaScript 或部分 TypeScript 项目并将其完全转换。需要添加一些 any类型和@ts-ignore注释,以便项目编译无误,但随着时间的推移,可以用更具描述性的类型替换它们。这种策略的优势如下:

  • 跨项目的一致性: 整体迁移将保证每个文件的状态相同,无需记住可以在何处使用 TypeScript 功能以及编译器将在何处防止基本错误。
  • 只修复一种类型比修复文件容易得多: 修复整个文件可能非常复杂,因为文件可能有多个依赖项。使用混合迁移,很难跟踪迁移的实际进度和文件的状态。

看起来整体迁移在这里更胜一筹。但是,对大型成熟代码库执行全面迁移的过程是一个复杂的问题。为此,Airbnb 开源了一个工具帮助将代码迁移到 TypeScript 的工具:ts-migrate

44456.webp.jpg

ts-migrate 接受一个 JavaScript 或部分 TypeScript 项目,并给出一个编译 TypeScript 项目,下面就来看看这个工具是如何使用的!

概述

ts-migrate 分为 3 个包:

这样就能够将转换逻辑与核心运行器分开,并为不同的目的创建多个配置。目前有两个主要配置:migrationreignore。虽然迁移配置的目标是从 JavaScript 迁移到 TypeScript,但 reignore 的目的是通过简单地忽略所有错误使项目可编译。当代码库很大并且正在执行以下任务时,Reignore 很有用:

  • 升级 TypeScript 版本
  • 对代码库进行重大更改或重构
  • 改进一些常用库的类型

这样,即使有一些不想立即处理的错误,也可以迁移项目。它使 TypeScript 或库的更新变得更加容易。

这两个配置都在 ts-migrate-server 上运行,它由两部分组成:

  • TSServer:与 VSCode 编辑器为编辑器和语言服务器之间的通信所做的非常相似。TypeScript 语言服务器的新实例作为单独的进程运行,开发工具使用语言协议与服务器通信。
  • Migration runner:运行并协调迁移过程。 它需要以下参数:
interface MigrateParams {
  rootDir: string;          // 根目录的路径  
  config: MigrateConfig;    // 迁移配置,包括插件列表
  server: TSServer;         // TSServer 分支的一个实例
}

它会执行以下操作:

  1. 解析 tsconfig.json
  2. 创建 .ts 文件。
  3. 将每个文件发送到 TypeScript 语言服务器进行诊断。编译器提供了三种类型的诊断:semanticDiagnosticssyntacticDiagnosticssuggestionDiagnostics。使用这些诊断来查找源代码中有问题的地方。基于唯一的诊断代码和行号,可以识别问题的潜在类型并应用必要的代码修改。
  4. 在每个文件上运行所有插件。如果文本因插件执行而改变,更新原始文件的内容并通知 TypeScript 语言服务器文件已更改。

通用插件

plugin 都会放在ts-migrate-plugins目录下。先看两个基于 jscodeshift 的插件:explicitAnyPlugindeclareMissingClassPropertiesPlugin

explicitAnyPlugin 会对所有文件中的语义诊断错误进行处理。对于无法推导类型的变量添加any,可以帮助解决编译问题。

// 转化前:
const fn2 = function(p3, p4) {}
const var1 = [];
// 转化后:
const fn2 = function(p3: any, p4: any) {}
const var1: any = [];

declareMissingClassPropertiesPlugin 会找到类申明中缺失的类型,并且添加any修饰。

基本使用

安装和配置TS

在开始迁移之前,需要安装和配置 TS:

  • 安装 TS 包:

javascript

复制代码

在开始迁移过程之前,我们必须安装和配置 TS
  • 初始化 TS 配置:

csharp

复制代码

npx tsc --init
  • 安装 React 类型(如果使用的是 React):

css

复制代码

npm install --save-dev@types/react

注意: init 命令将创建一个 tsconfig.json 文件。可以根据要求对其进行修改。

将 JS 文件转换为 TS

这里就实用上面说的 ts-migrate 工具将 JS 文件迁移到 TS:

  • 安装 ts-migrate:

css

复制代码

npm install --save-dev ts-migrate
  • 将 JS 文件重命名为 TS 文件,即将文件后缀从.js/.jsx转换成.ts/.tsx

python

复制代码

npm run ts-migrate -- rename <project-dir> --sources <specific-dir>
  • 将JS文件转换为TS格式:

python

复制代码

npm run ts-migrate -- migrate <project-dir> --sources <specific-dir>/file.tsx

注意:最好先提交重命名更改,然后再提交转换为 TS 更改。 这样 Git 将更改识别为 1 个文件而不是 2 个文件(删除的文件 + 新文件)。

示例

下面来看一个例子,将项目的 src/examples/example.js 转换为 TS,该文件内容如下:

// wrong-type-assignment
let age = 17;
age = "seventeen";
// assign-to-const
const color = "blue";
color = "red";
// add-conversions
function sum(a, b) {
  return a + b;
}
// declare-missing-class-properties
class Point {
  distance(point) {
    const dx = this.x - point.x;
    const dy = this.y - point.y;
    return Math.hypot(dx, dy);
  }
}

可以通过以下命令来重命名 JavaScript 文件:

npm run ts-migrate -- rename ./ --sources ./src/examples

这里 --sources ./src/examples 指定了 tsconfig.json 中 sources 的路径为 ./src/examples。该命令在项目根目录下运行,通过相对路径指定需要处理的文件或文件夹。执行完该命令后,src/examples/example.js 就变成了 src/examples/example.ts

接下来就需要将迁移脚本应用于 example.ts 文件:

css

复制代码

npm run ts-migrate -- migrate ./ --sources ./src/examples/example.ts

执行完该命令之后,就可以看到一些 ts-migrate 功能:88889.webp.jpg8890.webp.jpg34456.webp.jpg注意:

  • ts-migrate 无法自动修复 TS 问题,它会留下带有错误详细信息的 @ts-expect-error 注释。
  • 虽然 ts-migrate 在需要的地方将类型放入变量,但仍然需要记住将 any 类型更改为特定类型。

在运行 ts-migrate 命令时可以添加以下命令:

  • init <folder>:<folder> 文件夹中初始化一个 tsconfig.json 文件。
  • rename <folder>: 将 <folder> 文件夹中的 JavaScript/JSX 文件重命名为 TypeScript/TSX 文件。
  • migrate <folder>: 使用 codemods 修复 <folder> 文件夹中的 TypeScript 错误。
  • reignore <folder>: 在项目上重新运行 ts-ignore。

这些命令可以传递 --sources(或 -s)标志。该标志接受一个字符串路径(支持 glob 模式),表示项目的子集。当使用此标志时,ts-migrate 忽略默认源文件而使用您列出的文件代替。这实际上相当于将 tsconfig.json 的 include 属性替换为提供的 sources。此标志可以多次传递。

可用的选项包括:

  • -h, --help: 显示帮助信息。
  • -i, --init: 在 <folder> 文件夹中创建 tsconfig.json 文件。
  • -m, --migrate: 使用 codemods 修复 TypeScript 错误。
  • -rn, --rename: 将 <folder> 文件夹中的 JavaScript/JSX 文件重命名为 TypeScript/TSX 文件。
  • -ri, --reignore: 在项目上重新运行 ts-ignore。

下面是一些示例:

  • npm run ts-migrate -- --help: 显示帮助信息。
  • npm run ts-migrate -- init frontend/foo: 在 frontend/foo 文件夹中创建 tsconfig.json 文件。
  • npm run ts-migrate -- rename frontend/foo: 将 frontend/foo 文件夹中的 JavaScript/JSX 文件重命名为 TypeScript/TSX 文件。

ts-migrate:github.com/airbnb/ts-m…

相关文章
|
14天前
|
Rust JavaScript 前端开发
Node.js 添加对 TypeScript 的实验性支持
Node.js 添加对 TypeScript 的实验性支持
|
4天前
|
JavaScript 前端开发 编译器
探索 TypeScript:JavaScript 的超集
TypeScript 是由微软开发的开源编程语言,作为 JavaScript 的严格超集,增加了静态类型系统和对 ES6+ 特性的支持,有效解决了动态类型带来的问题。本文介绍 TypeScript 的核心概念(类型系统、接口、类、模块),探讨其优势(提高代码质量、增强可读性、促进团队协作)及基本用法(安装、配置、编写、编译代码)。此外,还介绍了接口、类、泛型和高级类型等进阶主题,帮助开发者更好地利用 TypeScript 构建健壮的应用。
|
5月前
|
JavaScript 前端开发 安全
使用TypeScript增强JavaScript应用的类型安全性
【5月更文挑战第23天】TypeScript是微软开发的JavaScript超集,引入静态类型检查和面向对象特性,提升代码可维护性和可靠性。它在编译阶段捕获类型错误,增强代码可读性,并通过接口、类、泛型和类型断言等工具确保类型安全。使用TypeScript能有效避免复杂项目中的调试难题,尤其适合大型项目。
|
2月前
|
JavaScript 前端开发
JavaScript / TypeScript日期格式化(dateFormat)
这篇文章介绍了如何在TypeScript中创建和使用一个日期格式化函数`dateFormat`,支持多种日期格式的自定义,并提供了函数的实现代码和使用示例。
JavaScript / TypeScript日期格式化(dateFormat)
|
1月前
|
JSON JavaScript 前端开发
如何使用代码注释:关于JavaScript与TypeScript
TSDoc是一种标准化TypeScript代码文档注释的规范,使不同工具能无干扰地提取内容。它包括多种标记,如@alpha、@beta等发布阶段标记;@decorator、@deprecated等功能标记;@defaultValue、@eventProperty等描述标记;@example、@experimental等示例与实验性标记;@inheritDoc、@internal等引用与内部标记;@label、@link等链接标记;@override、@sealed等修饰符标记;以及@packageDocumentation、@param、
28 5
|
2月前
|
JavaScript 前端开发 安全
揭秘TypeScript的魔力:它是如何华丽变身为JavaScript的超能英雄,让您的代码飞入全新的编程维度!
【8月更文挑战第22天】在Web开发领域,JavaScript是最主流的编程语言之一。但随着应用规模的增长,其类型安全和模块化的不足逐渐显现。为解决这些问题,微软推出了TypeScript,这是JavaScript的一个超集,通过添加静态类型检查来提升开发效率。TypeScript兼容所有JavaScript代码,并引入类型注解功能。
31 2
|
2月前
|
JavaScript 前端开发 安全
【技术革新】Vue.js + TypeScript:如何让前端开发既高效又安心?
【8月更文挑战第30天】在使用Vue.js构建前端应用时,结合TypeScript能显著提升代码质量和开发效率。TypeScript作为JavaScript的超集,通过添加静态类型检查帮助早期发现错误,减少运行时问题。本文通过具体案例展示如何在Vue.js项目中集成TypeScript,并利用其类型系统提升代码质量。首先,使用Vue CLI创建支持TypeScript的新项目,然后构建一个简单的待办事项应用,通过定义接口描述数据结构并在组件中使用类型注解,确保代码符合预期并提供更好的编辑器支持。
59 0
|
2月前
|
JavaScript 前端开发 安全
TypeScript:解锁JavaScript的超级英雄模式!类型系统如何化身守护神,拯救你的代码免于崩溃与混乱,戏剧性变革开发体验!
【8月更文挑战第22天】TypeScript作为JavaScript的超集,引入了强大的类型系统,提升了编程的安全性和效率。本文通过案例展示TypeScript如何增强JavaScript:1) 显式类型声明确保函数参数与返回值的准确性;2) 接口和类加强类型检查,保证对象结构符合预期;3) 泛型编程提高代码复用性和灵活性。这些特性共同推动了前端开发的标准化和规模化。
51 0
|
3月前
|
JavaScript 前端开发 IDE
TypeScript取代JavaScript的优势
TypeScript取代JavaScript的优势
|
4月前
|
JavaScript 前端开发 编译器
探讨TypeScript如何帮助JavaScript开发者避免这些常见错误,从而提高代码质量和开发效率
【6月更文挑战第13天】TypeScript,JavaScript的超集,通过添加静态类型检查和面向对象特性,帮助开发者避免常见错误,提升代码质量和开发效率。它能检测类型错误,防止运行时类型转变引发的问题;使用可选链和空值合并避免引用错误;通过枚举减少逻辑错误中的魔法数字;接口和泛型等特性提高代码可维护性。学习TypeScript对提升JavaScript开发质量有显著效果。
52 4
下一篇
无影云桌面