返回 导航

其他

hangge.com

TypeScript - 运行 TS 代码的5种方式详解(搭建 TS 运行环境)

作者:hangge | 2026-07-29 09:12
        TypeScriptJavaScript 的超集,添加了静态类型检查等特性。但由于浏览器和 Node.js 无法直接运行 TypeScript 代码,我们需要先将其编译为 JavaScript。本文将介绍几种常见的运行 TypeScript 代码的方式,包括使用 tsc 编译器、ts-nodetsxBun 以及通过 webpack 搭建开发环境,帮助大家快速上手 TypeScript 开发。

一、基本介绍

1,为什么 TypeScript 需要编译

(1)TypeScript 是一种静态类型的编程语言,它在 JavaScript 的基础上增加了类型系统。但浏览器和 Node.js 运行时只能执行 JavaScript 代码,因此需要将 TypeScript 代码编译(或称转译)成 JavaScript 代码才能运行。

(2)整个编译流程如下图所示:
提示TypeScript 编译器(tsc)不仅负责将 TS 转换为 JS,还会在编译过程中进行类型检查,帮助我们在开发阶段发现潜在的类型错误。

2,运行 TypeScript 的几种方式

(1)根据不同的使用场景,我们可以选择以下几种方式来运行 TypeScript 代码:
  • 方式一:使用 tsc 手动编译后运行 —— 适合学习、简单脚本
  • 方式二:使用 ts-node 直接运行 —— 适合 Node.js 环境下的开发调试
  • 方式三:使用 tsx 直接运行 —— 推荐,速度更快,ESM 支持更好
  • 方式四:使用 Bun 直接运行 —— 原生支持 TypeScript,无需额外配置
  • 方式五:使用 webpack/Vite 等构建工具 —— 适合前端项目开发

(2)下面是各个方式的比较:
方式 适用场景 特点
tsc 学习、简单脚本 手动编译,步骤较多
ts-node Node.js 开发调试 直接运行,但启动较慢
tsx Node.js 开发调试 推荐,启动快,ESM 支持好
Bun 通用开发 原生支持,零配置
webpack/Vite 前端项目 热更新,完整开发环境

二、使用 tsc 手动编译后运行

1,全局安装 TypeScript

(1)首先确保已安装 Node.js 环境。然后在终端执行以下命令全局安装 TypeScript
提示:建议使用 npm 全局安装,这样可以在任意目录使用 tsc 命令。如果想安装特定版本,可以指定版本号如 typescript@5.3.0
# 全局安装最新版本的 TypeScript
npm install -g typescript

# 或安装指定版本
npm install -g typescript@5.3.0

(2)安装完成后,可以使用以下命令验证安装是否成功:
# 查看 tsc 版本
tsc --version

# 或使用简写
tsc -v

(3)如果看到类似 Version 6.x.x 的输出,说明安装成功。

2,使用 tsc 编译 TypeScript 代码

(1)创建一个简单的 TypeScript 文件 math.ts
function sum(num1: number, num2: number): number {
  return num1 + num2;
}

console.log(sum(10, 20));

(2)在终端中执行如下编译命令:
tsc math.ts

(3)编译成功后,会在同目录下生成 math.js 文件。

(4)我们可以查看编译后的 JavaScript 代码。可以看到,TypeScript 中的类型注解(如 : number)在编译后被移除了。
// math.js - 编译后生成的 JavaScript 代码
function sum(num1, num2) {
  return num1 + num2;
}
console.log(sum(10, 20));

(5)现在可以使用 Node.js 运行编译后的文件,并查看输出结果。
node math.js

3,创建 tsconfig.json 配置文件

(1)对于稍大的项目,我们可以使用 tsconfig.json 文件来管理编译选项。执行以下命令可以快速生成配置文件 tsconfig.json
tsc --init

(2)生成的 tsconfig.json 文件包含所有可用的配置选项(默认被注释)。以下是一个常用的基础配置:
提示:配置好 tsconfig.json 后,直接执行 tsc 命令(不指定文件名)即可编译整个项目。编译器会根据配置文件中的 includeexclude 来确定要编译的文件。
{
  "compilerOptions": {
    "target": "ES2020",           // 编译目标版本
    "module": "commonjs",         // 模块系统
    "strict": true,               // 启用严格模式
    "esModuleInterop": true,      // 支持 ES 模块导入
    "skipLibCheck": true,         // 跳过库类型检查
    "outDir": "./dist",           // 输出目录
    "rootDir": "./src"            // 源代码目录
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

三、使用 ts-node 运行 TS 代码

1,安装 ts-node

(1)ts-node 是一个 TypeScript 执行环境,它允许我们直接运行 TypeScript 代码,无需手动编译。首先全局安装 ts-node
提示ts-node 需要依赖 tslib@types/node 两个包,建议一并安装。
# 全局安装 ts-node
npm install -g ts-node

# 安装依赖包
npm install -g tslib @types/node

(2)或者作为项目的开发依赖安装:
npm install -D ts-node tslib @types/node

2,运行 TypeScript 文件

(1)创建一个 TypeScript 文件 main.ts
function greet(name: string): void {
  console.log(`Hello, ${name}!`);
}

greet("TypeScript");

(2)使用 ts-node 直接运行:
ts-node main.ts

(3)如果是作为项目开发依赖安装的,可以使用 npx 运行:
npx ts-node main.ts

四、使用 tsx 运行 TS 代码(推荐)

1,tsx 介绍

(1)tsx 是新一代的 TypeScript 运行器,相比 ts-node 有以下优势:
  • 启动更快:基于 esbuild 进行转译,启动速度约 50ms,比 ts-node 快很多
  • ESM 支持更好:完整支持 ES Modules,无需额外配置
  • 兼容性强:可作为 ts-node 的直接替代品,支持 Node.js 18+
  • 活跃维护2024-2026 年已成为 Node.js 项目的默认 TypeScript 运行器

(2)对于新项目,建议优先使用 tsx 而非 ts-nodetsx 的定位是开发阶段的运行器,生产环境建议使用 tsctsup 编译后再运行。

2,安装并使用 tsx

(1)安装 tsx
# 全局安装
npm install -g tsx

# 或作为开发依赖
npm install -D tsx

(2)直接运行 TypeScript 文件:
# 使用 tsx 运行 TypeScript 文件
tsx main.ts

# 或使用 npx
npx tsx main.ts

(3)tsx 还支持监视模式。下面命令将采用监视模式运行(文件变化自动重新运行)。
tsx watch main.ts

(4)如果需要通过 Node.js 原生方式使用 tsx,可以注册为加载器(通过 Node.js--import 参数注册 tsx
node --import=tsx main.ts

五、使用 Bun 运行 TS 代码

1,Bun 简介

(1)Bun 是一个现代化的 JavaScript 运行时,它原生支持 TypeScript,无需任何配置即可直接运行 .ts 文件。

(2)Bun 的优势包括:
  • 原生 TypeScript 支持:零配置即可运行 TS 文件
  • 极致性能:启动速度和运行速度都非常快
  • 内置工具链:包管理器、测试框架、打包器一体化
  • 兼容 Node.js:支持大部分 Node.js API

2,安装并使用 Bun

(1)安装 Bun(以 macOS/Linux 为例):
# 使用 curl 安装
curl -fsSL https://bun.sh/install | bash

# 或使用 npm 安装
npm install -g bun

(2)安装完成后,可以直接运行 TypeScript 文件:
# 使用 bun 运行 TypeScript 文件
bun run main.ts

# 或简写
bun main.ts

(3)Bun 也支持在 package.json 中定义脚本:
提示Bun 内置的 TypeScript 转译器不会进行类型检查。如果需要类型检查,可以运行 bun tsc --noEmit 命令。
{
  "name": "my-project",
  "scripts": {
    "start": "bun run main.ts",
    "dev": "bun --watch main.ts"
  }
}
bun start
bun dev

六、使用 Vue CLI 搭建 TS 运行环境

1,创建 Vue3 + TypeScript 项目

(1)如果需要在浏览器中运行 TypeScript 代码,可以使用 Vue CLIVite 搭建开发环境。下面以 Vue CLI 为例:
# 创建新项目
vue create my-typescript-project

(2)在交互界面中选择:
  • 选择 Manually select features(手动选择功能)
  • 勾选 TypeScript 选项
  • 选择 Vue 3 版本

(3)项目创建完成后,目录结构如下:
my-typescript-project/
├── public/
│   └── index.html
├── src/
│   ├── App.vue        # 根组件
│   ├── main.ts        # 入口文件
│   └── shims-vue.d.ts # Vue 文件类型声明
├── tsconfig.json      # TypeScript 配置
└── package.json

2,项目文件说明

(1)入口文件 main.ts
// main.ts - 项目入口文件
import { createApp } from 'vue';
import App from './App.vue';

createApp(App).mount('#app');

(2)根组件 App.vue(使用 lang="ts" 声明 TypeScript):
<template>
  <div>Hello TypeScript</div>
</template>

<script lang="ts">
import { defineComponent } from 'vue';

export default defineComponent({
  name: 'App'
});
</script>

(3)运行开发服务器:
# 进入项目目录
cd my-typescript-project

# 运行开发服务器
npm run serve

# 或使用 Vite 创建的项目
npm run dev

附、tsconfig.json 常用配置详解

1,核心配置项说明

(1)tsconfig.jsonTypeScript 项目的核心配置文件,以下是常用配置项的详细说明。

(2)编译目标与模块相关配置:
{
  "compilerOptions": {
    // target: 指定编译后的 JavaScript 版本
    // 常用值: "ES5", "ES6", "ES2020", "ESNext"
    "target": "ES2020",
    
    // module: 指定生成代码的模块系统
    // 常用值: "commonjs", "es6", "esnext", "nodenext"
    "module": "commonjs",
    
    // lib: 指定运行时可用的 API(通常根据 target 自动推断)
    "lib": ["ES2020", "DOM"]
  }
}

(3)类型检查相关配置:
{
  "compilerOptions": {
    // strict: 启用所有严格类型检查选项(推荐开启)
    "strict": true,
    
    // noImplicitAny: 禁止隐式 any 类型
    "noImplicitAny": true,
    
    // strictNullChecks: 严格检查 null 和 undefined
    "strictNullChecks": true
  }
}

(4)模块解析相关配置:
{
  "compilerOptions": {
    // esModuleInterop: 允许 CommonJS 和 ES Module 互操作
    "esModuleInterop": true,
    
    // moduleResolution: 模块解析策略
    // "node" 适用于 Node.js,"classic" 是旧策略
    "moduleResolution": "node",
    
    // baseUrl: 模块解析的基础路径
    "baseUrl": ".",
    
    // paths: 路径别名映射(类似 webpack alias)
    "paths": {
      "@/*": ["src/*"]
    }
  }
}

(5)输出相关配置:
{
  "compilerOptions": {
    // outDir: 编译输出目录
    "outDir": "./dist",
    
    // rootDir: 源代码根目录
    "rootDir": "./src",
    
    // sourceMap: 是否生成 sourceMap 文件
    "sourceMap": true,
    
    // declaration: 是否生成 .d.ts 类型声明文件
    "declaration": true
  }
}

2,推荐的配置模板

(1)Node.js 项目推荐配置:
{
  "compilerOptions": {
    "target": "ES2022",
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "outDir": "./dist",
    "rootDir": "./src",
    "sourceMap": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules"]
}

(2)前端项目(配合 Vite/webpack)推荐配置:
提示noEmit: true 表示不输出编译文件,由 Vite/webpack 等构建工具负责打包。这样可以避免 TypeScript 编译器与构建工具重复工作。
{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "jsx": "preserve",
    "esModuleInterop": true,
    "skipLibCheck": true,
    "noEmit": true,
    "lib": ["ESNext", "DOM", "DOM.Iterable"],
    "baseUrl": ".",
    "paths": {
      "@/*": ["src/*"]
    }
  },
  "include": ["src/**/*.ts", "src/**/*.vue"],
  "exclude": ["node_modules"]
}
评论

全部评论(0)

回到顶部