告别 Node 噩梦?用 Bun + TypeScript 像写诗一样调用大模型
从 JS 弱类型的"坑"到一键接入 LLM,这套组合拳让我彻底爽到了
你有没有遇到过这样的场景:
前端从 input 框里拿到的数字,拼到 URL 里变成了 "1"+"2" → "12";
后端接口明明返回了 age: 18,却有人写成 age: "十八",然后整个支付流程静默失败......
JavaScript 的灵活,在大型项目里往往是噩梦的开端。
最近我尝试了一对"黄金搭档"------Bun + TypeScript ,不仅治好了我的类型焦虑,还让我用几行代码就调通了 DeepSeek 大模型。
这篇文章,我就从安装到实战,带你体验一次"零摩擦"的 AI Agent 开发。

🚀 Bun:不止是"更快的 Node"
如果你还在用 npm + Node 那一套,每次新建项目都要 npm init、安装 typescript、配置 tsconfig.json、折腾 nodemon......那真的该试试 Bun 了。
Bun 是一个JS/TS 运行时 + 包管理器 + 测试工具 的"全家桶"。
用一句话形容:开箱即用,快到离谱。
- 速度:启动、安装、执行都比 Node + npm 快好几倍(官方 benchmark 感人)
- 零配置 :直接运行
.ts文件,无需ts-node或预编译 - 内置 API :支持
fetch、WebSocket、Bun.serve()等,不用再装express写一堆样板 - 包管理 :
bun install替代 npm/yarn/pnpm,锁文件bun.lockb更高效
💡 一个小八卦:Anthropic(Claude 的母公司)已经收购了 Bun 团队,用于 Claude Code 的底层运行时。这说明 Bun 的稳定性与性能已经得到了顶级 AI 公司的认可。
安装(Windows 示例)
bash
# 官方一键脚本(需管理员权限)
powershell -c "irm bun.sh/install/windows | iex"
# 或者用 npm 全局安装(镜像源加速)
npm install -g bun --registry https://registry.npmmirror.com
安装完成后,试试这个:
bash
bun -v
# 输出: 1.x.x
是不是比 Node 那一套清爽多了?
🧠 TypeScript:JS 弱类型最后的救赎
JavaScript 的设计初衷是"让每个人都能轻松写几行脚本",但正因为太灵活,才容易在大型协作中埋雷。
比如这个经典问题:
ts
// 你期待加法,结果变成了拼接
let a = "1";
let b = 2;
console.log(a + b); // "12" ------ 不报错,但业务逻辑崩了
或者更隐蔽的------后端返回 { price: "19.99" }(字符串),你直接拿去 price * 0.9,结果返回 NaN,订单优惠消失......
TypeScript 做的很简单:在写代码时就告诉你这里可能出错。
ts
let nickname: string = "9527"; // 字符串
let age: number = 18; // 数字
function add(a: number, b: number): number {
return a + b;
}
add(1, "2"); // ❌ TS 编译报错: 类型"string"的参数不能赋给类型"number"的参数
虽然看起来多写了几笔类型注解,但当你项目超过 1000 行,或者有 3 个人协作时,类型就是最好的文档。
现在开发 AI Agent(比如用 LangChain、Vercel AI SDK),TypeScript 基本是标配。因为 AI 输出的 JSON 结构可能变化,类型系统能帮你提前捕获异常。
🧘 从 sleep 到异步:Promise 的优雅打开方式
在开始调用大模型之前,我们先复习一下 JS 的异步模型。
几乎所有 LLM API 调用都是异步 的(网络请求需要等待),掌握 Promise 和 async/await 是必须的。
下面是一个简单的 sleep 工具函数:
ts
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => setTimeout(resolve, ms));
}
// 使用示例
async function main() {
console.log("⏳ 开始等待...");
await sleep(2000);
console.log("✅ 2 秒后醒来");
}
main();

Promise 就像一次"许下的诺言"------现在拿不到结果,将来一定会给你(成功或失败)。
而 await 则让异步代码看起来像同步一样顺序执行,再也不用手写回调地狱了。
🌐 实战:用 Bun + TypeScript + Axios 调用大模型 API
现在我们来做一件真正酷的事:调用 DeepSeek(或其他兼容 OpenAI 格式的 LLM)。
1. 初始化项目
bash
mkdir bun-llm-demo
cd bun-llm-demo
bun init -y
这会自动生成 package.json 和 tsconfig.json(零配置!)。
2. 安装依赖
bash
bun add axios dotenv
axios:更友好的 HTTP 客户端(支持拦截器、自动 JSON 等)dotenv:加载.env环境变量(用于存放 API Key)
3. 添加环境变量
创建 .env 文件:
env
DEEPSEEK_API_KEY=sk-你的真实密钥
DEEPSEEK_BASE_URL=https://api.deepseek.com/v1
⚠️ 千万别把
.env提交到 Git!记得加.gitignore。
4. 写代码调用
创建 index.ts:
ts
import axios from "axios";
import dotenv from "dotenv";
dotenv.config();
async function chat() {
try {
const res = await axios.post(
`${process.env.DEEPSEEK_BASE_URL}/chat/completions`,
{
model: "deepseek-chat", // 或者 deepseek-coder
messages: [
{ role: "user", content: "你好,请用三句话介绍 Bun 运行时。" }
],
temperature: 0.7,
},
{
headers: {
"Content-Type": "application/json",
Authorization: `Bearer ${process.env.DEEPSEEK_API_KEY}`,
},
timeout: 30000, // 30 秒超时
}
);
const reply = res.data.choices[0].message.content;
console.log("🤖 AI 回复:\n", reply);
} catch (error: any) {
console.error("❌ 请求失败:", error.message);
if (error.response) {
console.error("状态码:", error.response.status);
console.error("详情:", error.response.data);
}
}
}
chat();
5. 运行
bash
bun run index.ts
你会看到 AI 流畅地输出介绍 Bun 的文字。
整个过程不到 10 行核心代码,没有 Webpack、没有 Babel、没有 ts-node------就是这么丝滑。

🧩 扩展:接入任意 OpenAI 兼容的 API
如果你用的是其他模型(如智谱、月之暗面、本地 Ollama),只需要改两个地方:
baseURL换成对方提供的地址model改成相应模型名称
甚至可以写一个通用函数:
ts
async function callLLM(prompt: string, model = "deepseek-chat") {
// ... 同上,动态传入 model
}
配合 TypeScript 的类型推导,你的 AI Agent 会非常健壮。
📌 总结:为什么你应该尝试 Bun + TypeScript?
| 痛点 | 传统 Node + JS | Bun + TypeScript |
|---|---|---|
| 类型错误 | 运行时才暴露,可能遗漏 | 编译时捕获,IDE 实时提示 |
| 配置 TS | 需要 ts-node, tsconfig, 甚至 webpack | 原生支持,开箱即用 |
| 包管理器速度 | npm install 等半天 | bun install 快到飞起 |
| 调用 LLM API | 需要 fetch polyfill 或 axios + 回调 | 直接 async/await,简洁干净 |
| 适合 AI Agent 开发 | 勉强可用,但生态碎片化 | 官方收购 + 社区涌现,趋势所在 |
在 AI 快速演进的今天,开发工具也应该"快、稳、爽"。
Bun 和 TypeScript 恰好就是这样的组合------不妥协性能,也不妥协代码质量。
下一步,你可以尝试用 Bun 配合 langchain 或 Vercel AI SDK 写一个能调用工具(Function Calling)的智能体。相信我,你会爱上这种开发体验。
💬 最后留个互动问题 :
你目前在用什么运行时/语言开发 AI 应用?有没有被 JS 弱类型坑过的"经典案例"?欢迎在评论区分享,一起避坑!

稀土掘金技术专栏 · 未经授权禁止转载
作者:一位热爱折腾的前端/全栈开发者
如果觉得有帮助,请点赞/收藏/分享,让更多人告别配置地狱。