Skip to content

如何在已有的CRA JS项目迁移为TS项目

约 1622 字大约 5 分钟

2026-01-27

你想把已有的 Create React App (CRA) JavaScript 项目迁移为 TypeScript 项目,我会给你提供一套分步、可落地、支持渐进式迁移的教程,既适合小型项目一次性迁移,也适合大型项目逐步过渡,不会影响现有业务运行。

前置准备

  1. 确保你的项目是标准 CRA 搭建的 JS 项目(无手动 eject 过底层配置,eject 项目迁移步骤更复杂,新手不推荐)。
  2. 已安装 Node.js(LTS 版本),验证命令:node -vnpm -v 能正常显示版本号。
  3. (可选)备份现有项目(避免操作失误丢失代码),可直接复制项目文件夹做备份。

迁移步骤(核心流程)

步骤 1:进入已有 CRA JS 项目目录

打开终端,切换到你的 CRA 项目根目录(例如 my-existing-cra-js-project):

cd my-existing-cra-js-project

步骤 2:安装 TypeScript 相关核心依赖

CRA 本身支持 TS,但需要手动安装 TS 编译器和 React 生态的类型声明包(因为 React、React DOM 等库本身是用 JS 编写的,TS 无法识别其类型),输入以下命令安装:

npm install --save typescript @types/react @types/react-dom @types/node

依赖说明:

  • typescript:TS 核心编译器,负责将 TS 代码转译为 JS 代码。
  • @types/react / @types/react-dom:React 和 React DOM 的类型声明包,让 TS 能识别 React 的 API 类型。
  • @types/node:识别 Node.js 相关的全局变量和 API(CRA 项目内部会用到)。

步骤 3:添加 TS 配置文件 tsconfig.json

在项目根目录下,手动创建一个空的 tsconfig.json 文件(无需填写任何内容)。

  • 可以直接在文件夹中新建文件命名为 tsconfig.json
  • 也可以用终端命令创建(Windows PowerShell / Mac/Linux 终端):
    # Windows PowerShell
    New-Item tsconfig.json
    
    # Mac/Linux 终端
    touch tsconfig.json

关键说明:CRA 启动时会自动识别这个空文件,并自动填充适配 CRA 的 TS 默认配置,新手无需手动编写复杂配置。

步骤 4:选择迁移方式(渐进式/一次性,推荐渐进式)

CRA 支持 JS 和 TS 文件共存,这是迁移的最大便利——你不需要一次性修改所有文件,可以先保证现有 JS 功能正常,再逐步将 JS 文件改为 TS 文件,适合大型项目避免一次性出现大量报错难以处理。

方式 A:渐进式迁移(推荐,适合中大型项目)
  1. 文件后缀修改规则
    • 包含 JSX 语法的文件(React 组件,例如 App.jsHome.js):后缀从 .js 改为 .tsx
    • 纯逻辑文件(无 JSX,例如 utils.jsapi.js):后缀从 .js 改为 .ts
  2. 迁移步骤
    • 先挑选一个简单的组件/工具文件进行修改(例如先改 utils.jsutils.ts,或 App.jsApp.tsx)。
    • 修改后,启动项目,修复该文件的 TS 语法错误(例如给变量添加类型、给函数参数/返回值定义类型、给组件 props 定义接口等)。
    • 一个文件验证通过后,再继续修改下一个,逐步完成全项目迁移。
  3. 关键技巧:若某个文件暂时不想处理 TS 报错,可先在文件顶部添加注释 // @ts-ignore 忽略单个报错,或 // @ts-nocheck 忽略整个文件的 TS 校验(后续再回头处理)。
方式 B:一次性迁移(适合小型项目)

直接将 src/ 目录下所有文件按后缀规则批量修改:

  • 所有 .jsx.tsx,所有 .js.ts(例如 index.jsindex.tsx(因为包含 JSX)、App.jsApp.tsx)。
  • 修改完成后,启动项目,批量修复 TS 报错(小型项目文件少,报错量可控,适合快速完成迁移)。

步骤 5:启动项目,自动生成补充文件并验证

输入 CRA 启动命令,启动项目:

npm start
  1. 启动时,CRA 会自动完成两个操作:
    • tsconfig.json 填充完整的默认配置(无需手动修改)。
    • src/ 目录下自动生成 react-app-env.d.ts 文件(CRA 专属类型声明文件,用于让 TS 识别图片、CSS 等静态资源,保留即可,无需编辑)。
  2. 验证效果:
    • 若项目能正常启动,浏览器能正常显示页面,说明基础迁移成功。
    • 若终端/编辑器出现 TS 报错,针对报错文件进行类型补充即可(新手可先聚焦简单报错,如「缺少类型声明」)。

步骤 6:(可选)清理多余依赖/优化配置

迁移完成后,若不需要再保留 JS 兼容,可做简单优化:

  1. 检查 package.json,确保 TS 相关依赖已正常安装(无报错)。
  2. 若想严格限制 TS 校验规则,可修改 tsconfig.json 中的配置(例如将 strict 改为 true,开启严格模式,强制所有变量/函数都添加类型声明,新手可后期再开启)。

常见问题与解决方案(新手必看)

  1. 报错:Cannot find module './App' 或 './xxx.css'
    • 原因:TS 无法识别非 TS/JS 文件,react-app-env.d.ts 未正常生成。
    • 解决方案:重启项目,确保 src/ 目录下有 react-app-env.d.ts 文件,若没有可手动创建并添加以下内容:
      /// <reference types="react-scripts" />
  2. 组件 props 报错:Property 'xxx' does not exist on type '{}'
    • 原因:React 组件 props 未定义类型,TS 默认识别为空对象 {}
    • 解决方案:给组件 props 定义接口(interface),示例:
      // App.tsx
      import React from 'react';
      
      // 定义 props 接口
      interface AppProps {
        title?: string; // 可选属性,加 ?
      }
      
      // 给组件传入 props 类型
      const App: React.FC<AppProps> = (props) => {
        return <h1>{props.title || '默认标题'}</h1>
      };
      
      export default App;
  3. 启动项目提示 "Type error: Cannot find name 'xxx'"
    • 原因:变量/函数未定义类型,或缺少对应的类型声明包。
    • 解决方案:给变量添加明确类型(例如 const count: number = 0;),若为第三方库报错,安装对应的 @types/xxx 依赖。

总结

  1. 已有 CRA JS 迁移 TS 的核心步骤:安装 TS 相关依赖 → 创建空 tsconfig.json → 按规则修改文件后缀 → 启动项目自动生成配置 → 修复 TS 报错。
  2. 迁移方式优先选择渐进式,支持 JS/TS 共存,降低中大型项目迁移风险,小型项目可选择一次性迁移。
  3. 关键细节:含 JSX 的文件改 .tsx,纯逻辑文件改 .tsreact-app-env.d.ts 用于识别静态资源,组件 props 需定义接口解决类型报错。