欢迎光临
我们一直在努力

你以为你懂 + 号?看完这篇 Bun + TS 实战,才发现以前全写错了

你一定遇到过:用户输入明明是数字,一加就变成了字符串;代码跑得好好的,突然冒出个 NaN;熬夜两小时查 bug,结果发现是隐式类型转换…… 今天,我们从 JavaScript 的“易错点”出发,聊聊 TypeScript 如何救场,再认识一下比 Node 更快、开箱即用的 Bun 运行时,最后用一次真实的 LLM API 请求串起所有知识点。

一、JavaScript 那些让人抓狂的“易错行”

1.1 “+” 的双重人格:加法还是拼接?

// 你期望的是 3,结果得到 "12"
let a = 1;
let b = "2";
console.log(a + b); // "12"

根源:JS 是弱类型语言,+ 运算符在遇到字符串时,会优先执行字符串拼接。 更可怕的是:它不会报错。错误悄悄隐藏在系统里,直到某天线上数据错乱,才追悔莫及。

1.2 浏览器的 input 永远返回字符串

<input type="number" id="age" />
let age = document.getElementById("age").value; // 永远是 string
let nextYear = age + 1; // "181" 而非 19

1.3 没有约束的大型项目 = 定时炸弹

没有类型检查,函数传参全凭“默契”:

function add(a, b) {
return a + b;
}
add(1, "2"); // "12",没人阻止你


二、TypeScript:给 JS 穿上“防弹衣”

TypeScript 是微软开发的 JS 超集,它添加了静态类型系统,在编译阶段(.ts → .js)就检查类型错误。

2.1 基础类型约束

// 1.ts
const nickname: string = "9527";
const age: number = 18; // 如果写成 "18" 立即报错
console.log(`我是 ${nickname}, 我今年 ${age} 岁`);

2.2 函数参数与返回值类型

// 2.ts
function add(a: number, b: number): number {
return a + b;
}

let a = 1;
let b = "2";
// add(a, b); // ❌ 类型错误:参数 b 不能是 string

强制类型转换——把“字符串数字”变成真数字:

let c: number = add(a, Number(b)); // 显式转换
let d: number = add(a, parseInt(b)); // 另一种
let e: number = add(a, +b); // 一元加号(隐式,但常用)

为什么 TypeScript 成了 AI Agent 的标配? 因为 LLM 生成的代码动辄上千行,没有类型约束,AI 自己都可能写出传错参数的问题。TS 让 AI 生成的代码更可靠。


三、JavaScript 异步与 sleep:从回调到 Promise

JS 是单线程 + 事件循环,异步操作用回调、Promise、async/await 处理。 下面封装一个通用的 sleep 函数:

// 3.js
function sleep(t) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(); // 时间到,承诺兑现
}, t);
});
}

async function main() {
console.log('–start–');
await sleep(2000); // 等 2 秒,但不会阻塞整个线程
console.log('–end–');
}

main();

原理:await 后面必须是一个 Promise。sleep 返回一个 Promise,2 秒后 resolve,await 才继续往下执行。这就是“异步任务同步化”。


四、Bun:比 Node 更快、零配置的 JS/TS 运行时

Bun 不只是运行时,它还内置了包管理器(可代替 npm/yarn/pnpm)、打包器、测试器。 一句话:Node 的优化升级版,性能炸裂。

4.1 Bun vs Node:到底快在哪?

维度Node (V8)Bun (JavaScriptCore + Zig)
启动速度 较慢(解析模块、初始化环境) 极快(JSC 引擎轻量,Zig 编译的原生二进制)
包安装速度 npm 需下载所有依赖到 node_modules 内置二进制缓存,软链接 + 全局缓存,秒级安装
TS 支持 需要 ts-node 或预编译 开箱即用,直接 bun run index.ts
内置 API 大部分需 require('fs') 等 原生 Bun.file、Bun.write、Bun.serve 极简 API
兼容性 标准 Node API 兼容大部分 Node API(如 fs、path)

深入 Bun 的优化:

  • 底层使用 Zig 语言:没有 C++ 的垃圾回收停顿,内存管理更可控。

  • JavaScriptCore 引擎:相比 V8,JSC 的启动时间更短,内存占用更低(iOS 和 Safari 也在用)。

  • 内置了 HTTP、文件、加密等原生模块:不需要像 Node 那样通过 libuv 绕一层,直接调用系统底层。

  • 对 TypeScript 的一等支持:bun run 会实时编译 TS 并缓存,无需单独配置 tsconfig.json。

4.2 零配置运行 TypeScript

# 不用装 typescript、ts-node、nodemon
bun run index.ts

用 Bun 替代 npm 安装依赖:

bun add axios dotenv # 比 npm install 快 10~30 倍


五、实战:用 Bun + TypeScript 调用 LLM API

下面是一个完整的请求 DeepSeek(或任何 OpenAI 格式)接口的例子。我们顺便拆解 HTTP 请求的三大组成部分。

5.1 请求行、请求头、请求体

  • 请求行:POST /v1/chat/completions HTTP/1.1(方法、URL路径、HTTP版本)

  • 请求头:Content-Type: application/json,Authorization: Bearer sk-xxx

  • 请求体:JSON 格式的消息数据

5.2 完整代码(index.ts)

// 使用 Bun 运行,无需额外配置
import axios from 'axios';
import dotenv from 'dotenv';
dotenv.config();

async function chat() {
try {
const baseUrl = process.env.DEEPSEEK_BASE_URL;
const apiKey = process.env.DEEPSEEK_API_KEY;

const res = await axios.post(
baseUrl, // 请求行 → POST {baseUrl}
{
model: 'deepseek-chat', // 注意:模型名必须正确
messages: [
{ role: 'user', content: '你好,介绍一下 Bun' }
]
},
{
headers: { // 请求头
'Content-Type': 'application/json',
Authorization: `Bearer ${apiKey}`
},
timeout: 15000 // 超时控制,避免卡死
}
);
// 打印响应体中的内容
console.log('✅ 接口返回:', res.data.choices[0].message.content);
} catch (err: any) {
// 完整错误处理
console.log('\\n❌ 请求出错:');
if (err.response) {
console.log('状态码:', err.response.status);
console.log('接口返回详情:', err.response.data);
} else {
console.log('错误信息:', err.message);
}
}
}

chat();

5.3 常见坑点(根据笔记真实踩坑)

  • 模型名称错误:写成 deepseek-v4-flash 但账号无权限 → 400 错误。改为 deepseek-chat(通用模型)即可。

  • 只打印 err.message:看不到状态码和原始返回,误以为“没有输出”。正确做法是打印 err.response 详情。

  • 没有配置 timeout:网络慢时请求一直 pending,程序卡死。加上 timeout: 15000,超时自动进入 catch。


六、总结:为什么现代全栈开发推荐 Bun + TypeScript?

痛点解决方案
JS 弱类型导致的隐式错误 TypeScript 静态类型 + 编译检查
字符串与数字混淆 显式类型转换(Number()、+、parseInt)
异步回调地狱 Promise + async/await(如 sleep)
Node 启动慢、配置繁琐 Bun 零配置,速度提升 3~5 倍
依赖安装耗费时间 Bun 内置包管理器,秒级安装
API 请求错误难以调试 完整捕获 err.response 并打印

Bun 已经被 Anthropic 收购用于 Claude Code 底层——足以证明它在性能、稳定性上得到了顶级 AI 公司的认可。

现在,你就可以用 bun init 创建一个新项目,写 TypeScript,调 LLM,再也不必被 Node 和 TS 配置折磨了。

 

赞(0)
未经允许不得转载:171主机测评 » 你以为你懂 + 号?看完这篇 Bun + TS 实战,才发现以前全写错了
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址