Deno v1.44.4跨平台编译异常:macOS成功Linux x86报错
request.body.text()不存在 问题背景
两台机器均运行Deno v1.44.4(内置TypeScript 5.4.5),执行以下编译命令:
deno compile --output ../release/cobble --allow-env --allow-net --allow-read --allow-write --allow-run ../backend/server.ts && cd ../release/ && zip -r ../cobblequarry.zip *
出现平台不一致问题:
- macOS X64平台编译正常
- Linux X86平台编译失败,抛出TypeScript类型错误:
Check file:///home/codepleb/cobble-quarry/backend/server.ts
error: TS2339 [ERROR]: Property 'text' does not exist on type '{ (options: BodyOptions<"bytes">): BodyBytes; (options: BodyOptions<"form">): BodyForm; (options: BodyOptions<"form-data">): BodyFormData; (options: BodyOptions<...>): BodyJson; (options: BodyOptions<...>): BodyReader; (options: BodyOptions<...>): BodyStream; (options: BodyOptions<...>): BodyText; (options?: BodyOpt...'.
let command: string = await ctx.request.body.text();
~~~~
at file:///home/codepleb/cobble-quarry/backend/server.ts:124:52
此前适配Linux的方案在macOS无法编译,当前适配macOS的方案则在Linux报错,暂不确定是否为TypeScript版本问题。
解决方法
1. 替换为request.text()快捷方法
Deno的Request对象原生提供了text()快捷方法,无需先调用body(),直接绕过重载类型推断问题:
let command: string = await ctx.request.text();
2. 显式指定body类型参数
如果必须使用body()方法,显式传入类型参数让TypeScript明确返回类型:
let command: string = await ctx.request.body({ type: "text" }).text();
3. 升级Deno版本
该问题大概率是Deno v1.44.4的跨平台类型定义bug,升级到最新稳定版(如v1.45及以上)可修复这类平台一致性问题。
4. 临时跳过类型检查(不推荐)
若需紧急编译,可添加--no-check参数绕过TypeScript类型校验:
deno compile --no-check --output ../release/cobble --allow-env --allow-net --allow-read --allow-write --allow-run ../backend/server.ts && cd ../release/ && zip -r ../cobblequarry.zip *
注意:此方法会忽略所有类型错误,可能隐藏潜在问题,仅作临时应急使用。
内容的提问来源于stack exchange,提问作者codepleb

