TensorFlow.js TypeScript示例中await报错及yield保留字问题求助
解决TypeScript中TensorFlow.js的await报错与模块解析问题
看起来你碰到了两个TFJS+TS搭配的典型坑,我来一步步帮你拆解解决:
一、await使用问题:loss undefined & async修饰错误
首先得明确一个核心规则:await只能在标记为async的函数内部使用,你说给model变量加async肯定是错的——async是用来修饰函数的,不是变量!
正确的使用姿势:
- 把调用
model.fit()(或其他异步TFJS方法)的代码放到async函数里:
async function trainModel() { const model = tf.sequential({ layers: [tf.layers.dense({units: 1, inputShape: [1]})] }); model.compile({optimizer: 'sgd', loss: 'meanSquaredError'}); // 这里用await是安全的,因为在async函数内部 const history = await model.fit(xs, ys, {epochs: 10}); console.log(history.history.loss); // 现在loss不会是undefined了 } // 调用async函数,记得捕获可能的错误 trainModel().catch(err => console.error(err));
- 如果是在类的方法里使用,把方法标记为async即可:
class ExperimentModels { async train() { const model = tf.sequential(...); model.compile(...); const history = await model.fit(...); console.log(history.history.loss); } }
为什么移除await后loss会undefined?
因为model.fit()返回的是一个Promise,直接调用的话还未完成异步操作,拿到的history是未resolved的Promise对象,自然没有history.history.loss这个属性。必须用await等待Promise完成,才能拿到实际的训练历史对象。
二、模块解析错误:"The keyword 'yield' is reserved"
这个错误通常是因为你的TypeScript或webpack配置没有正确支持ES6生成器语法(yield是生成器函数的关键字),TFJS内部可能用到了生成器,所以需要调整配置:
解决步骤:
- 检查
tsconfig.json,确保开启ES6+相关支持:
{ "compilerOptions": { "target": "ES2017", // 至少设置为ES2015,推荐ES2017及以上 "lib": ["ES2017", "DOM"], // 包含DOM适配浏览器环境 "downlevelIteration": true, // 关键配置:支持生成器的降级处理 "module": "ESNext", // 或CommonJS,根据你的打包工具选择 "moduleResolution": "node" } }
如果使用webpack配合babel,需要安装插件处理生成器:
先安装依赖:npm install @babel/plugin-transform-regenerator --save-dev然后在
babel.config.json中添加插件:{ "plugins": ["@babel/plugin-transform-regenerator"] }若用ts-loader,确保webpack已正确读取tsconfig的配置。
升级TFJS版本:如果是旧版本可能存在兼容性问题,建议更新到最新稳定版:
npm install @tensorflow/tfjs@latest --save
额外排查点:
如果你的代码里不小心把yield用作变量名或其他非生成器场景,也会触发这个错误——但根据报错路径,大概率是TFJS模块内部的语法兼容问题,优先调整配置即可。
内容的提问来源于stack exchange,提问作者user6600549
相关产品推荐
相关产品推荐

