把 Python 代码改成 TypeScript 时,先锁定输入、输出、异常和边界,再让 AI 转换。逐行改写很容易漏掉隐含行为:Python 类型提示默认不在运行时强制,JavaScript 的数字又能表示小数;只看“能编译”不能证明新旧逻辑一致。
用行为表约束转换范围
示例任务是把一个 0 到 100 的整数映射为等级:小于 40 为 low,40 到 69 为 mid,70 到 100 为 high;小数、布尔值和范围外数值都拒绝。这个例子只用于演示迁移方法,不代表在某个线上项目测试过。

| 输入 | 预期结果 | 要检查的边界 |
|---|---|---|
| 39 | low | 40 以下 |
| 40 | mid | 下边界包含 |
| 69 | mid | 70 以下 |
| 70、100 | high | 上档起点与最大值 |
| -1、101、40.5、true | 报错 | 非法输入 |
原始 Python 逻辑先固定下来:type(score) is int 用来排除布尔值,因为 Python 中布尔类型与整数有继承关系;然后检查范围并按两个阈值返回结果。
def score_band(score: int) -> str:
if type(score) is not int or not 0 <= score <= 100:
raise ValueError("score must be an integer from 0 to 100")
if score >= 70:
return "high"
if score >= 40:
return "mid"
return "low"
先让 AI 说明语义,再生成目标代码
把原函数、调用方和行为表一起提供,并要求模型先指出 Python 特有行为与迁移假设。提示词可以这样写:
请把下面的 Python 函数迁移到 TypeScript。
保持输入检查、返回字符串和错误边界不变;不要添加依赖。
先列出 Python 与 TypeScript 的语义差异,再给出代码和覆盖 39、40、69、70、100、-1、101、40.5、true 的测试。
如果原代码没有定义某个行为,请先提问,不要自行补业务规则。
迁移后的实现示例:
type Band = 'low' | 'mid' | 'high';
function scoreBand(score: number): Band {
if (!Number.isInteger(score) || score < 0 || score > 100) {
throw new RangeError('score must be an integer from 0 to 100');
}
if (score >= 70) return 'high';
if (score >= 40) return 'mid';
return 'low';
}
for (const score of [39, 40, 69, 70, 100]) {
console.log(score, scoreBand(score));
}
这段示例的预期输出依次是 39 low、40 mid、69 mid、70 high、100 high。对非法输入还应断言函数抛出错误。TypeScript 的联合类型能限制返回值集合,但类型本身不会替你验证外部输入,所以 Number.isInteger 和范围检查仍需保留。
尤其要覆盖 Python 布尔值与 TypeScript 外部输入的差异:Python 的 bool 是 int 的子类,而 TypeScript 函数签名在编译后不会校验运行时值。可把 true 作为未知输入传入并断言拒绝:
const invalid: unknown[] = [-1, 101, 40.5, true, '40'];
for (const value of invalid) {
let rejected = false;
try {
scoreBand(value as number);
} catch (error) {
rejected = error instanceof RangeError;
}
if (!rejected) throw new Error(`应拒绝非法输入:${String(value)}`);
}
这里的类型断言只绕过编译器以模拟 API、JSON 等外部数据;它不会在运行时转换值。若你的入口接收未知数据,应先校验类型,再调用业务函数。
编译、对照测试,再替换调用方
- 把函数放入独立文件,按项目现有配置运行 TypeScript 编译器,例如
npx tsc --strict --noEmit。 - 让 Python 原函数和 TypeScript 新函数共享同一组输入向量,逐个比较正常返回值;非法输入分别确认两边都拒绝。
- 补充原项目的空值、时区、整数精度、文件路径、异常类型等真实边界。语言转换不自动解决 API、并发、生态库和运行时差异。
- 先迁移一个模块并检查调用点与类型,再删除旧实现;不要一边让 AI 重写多个目录一边失去可回退的基线。
什么时候不能直接迁移
涉及 Python 动态属性、生成器、装饰器、NumPy 数组、异步 I/O 或第三方库时,单个函数的对照表不够。先明确目标运行时和替代依赖,保留一组能代表真实调用路径的测试。本文示例没有在你的仓库或目标环境执行;编译和回归结果要以本地项目为准。
官方资料
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/32355.html