文章目录
- [一、认识 Bun:更快更强的 JS/TS 运行时与包管理器](#一、认识 Bun:更快更强的 JS/TS 运行时与包管理器)
-
- [1.1 什么是 Bun](#1.1 什么是 Bun)
- [1.2 Bun 核心定位](#1.2 Bun 核心定位)
- [二、TypeScript:为 JavaScript 补齐类型能力](#二、TypeScript:为 JavaScript 补齐类型能力)
-
- [2.1 TypeScript 基础概念](#2.1 TypeScript 基础概念)
- [2.2 为什么需要 TypeScript](#2.2 为什么需要 TypeScript)
- [2.3 JavaScript 弱类型带来的典型隐患](#2.3 JavaScript 弱类型带来的典型隐患)
-
- [2.3.1 场景复现:输入框值的类型陷阱](#2.3.1 场景复现:输入框值的类型陷阱)
- [2.3.2 衍生问题:加法与字符串拼接混淆](#2.3.2 衍生问题:加法与字符串拼接混淆)
- [三、Bun 环境安装(Windows 平台)](#三、Bun 环境安装(Windows 平台))
-
- [3.1 安装命令](#3.1 安装命令)
- [3.2 安装验证](#3.2 安装验证)
- [四、TypeScript 基础语法实战:类型约束与类型转换](#四、TypeScript 基础语法实战:类型约束与类型转换)
-
- [4.1 基础类型定义](#4.1 基础类型定义)
- [4.2 带类型约束的计算函数](#4.2 带类型约束的计算函数)
- [4.3 实战:字符串转数字(解决输入框类型问题)](#4.3 实战:字符串转数字(解决输入框类型问题))
- [五、异步编程实战:Promise 封装 Sleep 函数](#五、异步编程实战:Promise 封装 Sleep 函数)
-
- [5.1 需求说明](#5.1 需求说明)
- [5.2 完整代码实现](#5.2 完整代码实现)
- [5.3 代码核心解析](#5.3 代码核心解析)
- [5.4 Bun 运行代码](#5.4 Bun 运行代码)
- 六、全文总结
- 七、核心知识点复盘
- [八、常见问题 & 避坑指南](#八、常见问题 & 避坑指南)
-
-
- [8.1 Bun 安装后提示"无法识别 bun 命令"](#8.1 Bun 安装后提示“无法识别 bun 命令”)
- [8.2 定义了函数,但代码完全不执行](#8.2 定义了函数,但代码完全不执行)
- [8.3 `await` 关键字报错](#8.3
await关键字报错) - [8.4 TypeScript 类型不匹配报错](#8.4 TypeScript 类型不匹配报错)
- [8.5 输入框相加结果变成字符串拼接](#8.5 输入框相加结果变成字符串拼接)
-
一、认识 Bun:更快更强的 JS/TS 运行时与包管理器
1.1 什么是 Bun
Bun 是一款高性能、开箱即用、零配置的 JavaScript 与 TypeScript 一体化运行时,同时内置了完整的包管理器,可作为 Node.js 的优化升级版使用。
相较于传统 Node.js,Bun 核心优势集中在运行速度、启动效率、内置能力三大方向:启动更快、脚本执行效率更高,并且原生支持 TypeScript,无需额外编译配置,真正做到开箱即用。
目前 Bun 已被 Anthropic 公司收购,作为 Claude Code 产品的底层运行环境,在 AI 开发、AI Agent 领域得到广泛落地,是当下前端与服务端开发的热门工具。
1.2 Bun 核心定位
- 运行时:替代 Node.js,执行 JS、TS 代码,处理异步、IO、网络请求等逻辑
- 包管理器 :内置包管理能力,命令兼容
npm/pnpm,安装依赖速度远超传统工具 - 零配置:原生支持 TypeScript、ES 模块,无需额外配置编译工具链
二、TypeScript:为 JavaScript 补齐类型能力
2.1 TypeScript 基础概念
TypeScript(简称 TS)由微软推出,是 JavaScript 的超集 。简单理解:所有合法的 JavaScript 代码都可以直接在 TypeScript 中运行,而 TS 在 JS 基础上新增了静态类型约束能力。
2.2 为什么需要 TypeScript
JavaScript 是典型的弱类型语言,代码运行过程中不会强制校验数据类型,类型错误不会在编写阶段提示,往往等到线上运行才暴露问题,隐患极大。
而 TypeScript 引入静态类型检查:在代码编译阶段(TS 编译为普通 JS)就完成类型校验、语法错误检查,提前拦截潜在 Bug。如今 TypeScript 已经成为 AI Agent、大型前端项目、服务端项目的标配技术。
2.3 JavaScript 弱类型带来的典型隐患
弱类型是 JS 灵活的特点,但在业务开发中极易引发隐性故障,下面结合最常见的输入框场景举例说明。
2.3.1 场景复现:输入框值的类型陷阱
网页输入框 <input> 获取到的内容,无论用户输入数字还是文字,最终拿到的永远是字符串类型。在纯 JS 环境下,类型错误不会直接报错,只会出现逻辑异常,问题隐藏极深。
完整可运行 HTML 示例:
html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>JS 类型陷阱演示</title>
</head>
<body>
<!-- 文本输入框 -->
<input type="text" id="ipt">
<script>
// 获取页面输入框 DOM 元素
const ipt = document.getElementById('ipt');
// 绑定 change 事件:输入完成失去焦点后触发
ipt.addEventListener("change", function(event) {
// 打印输入内容 + 内容类型
console.log("输入值:", event.target.value);
console.log("数据类型:", typeof event.target.value);
})
</script>
</body>
</html>
代码解析:
getElementById根据 ID 获取输入框 DOM 节点;addEventListener("change", 回调函数):给输入框绑定值变更事件,用户输入完成、点击页面空白处(失去焦点)时触发;event.target:指向当前触发事件的 DOM 元素(也就是输入框);event.target.value:获取输入框的内容,结果一定是字符串string类型。
2.3.2 衍生问题:加法与字符串拼接混淆
JS 中 + 运算符具备双重逻辑:
- 两侧为数字:执行数学加法;
- 任意一侧为字符串:执行字符串拼接。
弱类型导致类型自动转换,最终计算结果和预期完全不符,且代码不会报错。TypeScript 的类型约束,就是为了从根源规避这类问题。
三、Bun 环境安装(Windows 平台)
Bun 安装流程极简,Windows 系统直接使用 PowerShell 一键在线安装,无需复杂配置。
3.1 安装命令
- 以管理员身份打开 Windows PowerShell;
- 复制执行以下官方安装命令:
powershell
powershell -c "irm bun.sh/install.ps1|iex"
3.2 安装验证
- 关闭当前 PowerShell,重新打开新终端(环境变量需重启生效);
- 执行验证命令:
powershell
bun --version
若正常输出版本号,代表 Bun 安装成功。
补充:Bun 原生支持 TypeScript,安装完成后可直接运行
.ts文件,无需安装ts-node、配置tsconfig。
四、TypeScript 基础语法实战:类型约束与类型转换
结合上面 JS 的类型问题,我们用 TypeScript 编写代码,直观感受静态类型约束的作用,同时讲解常用的字符串转数字方案。
4.1 基础类型定义
TS 允许我们显式定义变量、函数的类型,一旦类型不匹配,编写阶段就会抛出错误提示。
typescript
// 1. 显式定义变量类型
const nickname: string = "9527"; // 限定为字符串类型
const age: number = 18; // 限定为数字类型
// 模板字符串拼接
console.log(`我是${nickname},我今年${age}岁`);
核心说明 :
如果修改代码为 const age: number = "18",编辑器会立刻标红报错,编译阶段直接拦截类型错误,这是纯 JS 做不到的。
4.2 带类型约束的计算函数
定义数学加法函数,严格约束入参、返回值都为数字类型:
typescript
/**
* 两数相加函数
* @param a 第一个数字
* @param b 第二个数字
* @returns 相加结果(数字类型)
*/
function add(a: number, b: number): number {
return a + b;
}
4.3 实战:字符串转数字(解决输入框类型问题)
结合前面输入框场景,输入得到的是字符串,想要参与数学计算,必须做类型转换。这里介绍 JS/TS 通用的 4 种主流转换方式。
typescript
// 模拟场景:一个数字变量 + 一个字符串格式数字
let a = 1;
let b = "2";
// 方式1:Number() 全局函数(推荐,完整转换)
let c1: number = add(a, Number(b));
// 方式2:一元加号 + (简写,效果等价于 Number())
let c2: number = add(a, +b);
// 方式3:parseInt() 转为纯整数(自动舍弃小数)
let c3: number = add(a, parseInt(b, 10));
console.log(c1, c2, c3); // 输出:3 3 3
| 转换方式 | 特点 | 适用场景 |
|---|---|---|
Number() |
完整转换,非纯数字字符串返回 NaN |
整串为数字、带小数的场景 |
+ 变量 |
语法最简,逻辑同 Number() |
快速简写转换 |
parseInt(变量, 10) |
从左解析数字,遇到非数字停止,仅保留整数 | 字符串后带单位、只需整数的场景 |
五、异步编程实战:Promise 封装 Sleep 函数
异步是 JS/TS 核心知识点,setTimeout 是基础异步 API,结合 Promise 可以封装通用的延时函数,也是面试高频考点。
5.1 需求说明
封装 sleep 函数:传入延时毫秒数,等待指定时间后再执行后续代码。
5.2 完整代码实现
typescript
/**
* 封装延时函数
* @param t 延时时间(单位:毫秒)
* @returns Promise 对象
*/
function sleep(t: number) {
// Promise:ES6 标准异步解决方案,用于处理异步回调
return new Promise((resolve, reject) => {
// 定时器:延时 t 毫秒后执行回调
setTimeout(() => {
resolve(); // 异步执行成功,改变 Promise 状态
}, t);
});
}
// 异步主函数:使用 async/await 简化 Promise 调用
async function main() {
console.log("---start---");
// await 关键字:等待 Promise 执行完成,再执行下一行代码
// 注意:await 必须写在 async 修饰的函数内部
await sleep(2000);
console.log("---end---");
}
// 调用主函数(必须调用,代码才会执行)
main();
5.3 代码核心解析
- Promise 作用:解决传统异步回调嵌套过深的问题,统一异步代码写法;
resolve:异步任务执行成功时调用,标志 Promise 完成;async / await:语法糖,让异步代码写法近似同步代码,可读性大幅提升;- 执行逻辑 :先打印
---start---,等待 2 秒后,再打印---end---。
5.4 Bun 运行代码
将代码保存为 sleep.ts,终端执行命令:
bash
bun sleep.ts
即可看到延时效果。
六、全文总结
本文从实际开发痛点出发,依次讲解了 Bun、TypeScript 的核心概念,结合前端经典场景演示了 JS 弱类型的隐患、TS 类型约束的价值,同时完成了类型转换、异步 Sleep 函数两大实战案例。
- Bun:新一代高性能 JS/TS 运行时+包管理器,原生支持 TS、零配置、速度远超 Node.js,已应用在 Claude Code 等主流 AI 工具中;
- TypeScript:JS 的超集,通过静态类型检查,在编译阶段拦截类型错误,是大型项目、AI Agent 开发的标配;
- JS 核心痛点 :弱类型导致输入框取值恒为字符串、
+运算符逻辑混淆,隐性 Bug 难以排查; - 异步编程 :基于
Promise + setTimeout可封装通用延时函数,async/await是目前最优的异步写法。
七、核心知识点复盘
- Bun 定位:替代 Node.js 的运行时 + 内置包管理器,原生支持 TypeScript,安装命令
powershell -c "irm bun.sh/install.ps1|iex"; - TypeScript 核心价值:静态类型检查,提前规避弱类型带来的逻辑错误;
- 输入框取值规则:
input.value结果永远是字符串类型,计算前必须做类型转换; - 字符串转数字常用方案:
Number()、+、parseInt(); - 异步核心:
Promise处理异步任务,async/await简化异步代码,await仅可在async函数内使用。
八、常见问题 & 避坑指南
8.1 Bun 安装后提示"无法识别 bun 命令"
- 原因:环境变量未生效;
- 解决:完全关闭终端/VS Code 终端,重新打开再执行命令。
8.2 定义了函数,但代码完全不执行
- 原因:只定义函数,没有调用函数;
- 解决:代码末尾补充函数调用语句,例如
main()。
8.3 await 关键字报错
- 原因1:
await写在了非async函数中; - 解决:给外层函数添加
async修饰符; - 原因2:
await后面不是 Promise 对象; - 解决:保证
await接收 Promise 实例。
8.4 TypeScript 类型不匹配报错
- 原因:变量、函数入参/返回值的类型和定义不一致;
- 解决:按照定义的类型传值,或使用
Number/parseInt做类型转换。
8.5 输入框相加结果变成字符串拼接
- 原因:参与计算的变量为字符串类型;
- 解决:获取输入值后,统一转为数字类型再做数学运算。