未使用await获取Promise时,如何让TypeScript触发编译错误?
如何让TypeScript检测未await Promise的情况
这个问题我太有共鸣了——好几次写async函数,手滑忘了加await就直接赋值,等到后续调用属性方法时出现一堆莫名其妙的错误,排查半天才发现根源是拿到的是Promise对象而非实际返回值。
遗憾的是,TypeScript本身并没有专门的编译选项来强制要求必须await Promise,但我们有几个实用的方案来避免这个问题:
1. 用TypeScript严格编译选项间接检测
开启以下编译选项,能让TypeScript在你错误使用Promise对象时给出类型错误提示:
noImplicitAny:当你尝试调用myObject.someMethod()时,因为myObject是Promise<Something>类型,而非Something,TypeScript会提示你Promise上不存在someMethod方法,间接帮你发现没加await的问题。strictNullChecks:配合noImplicitAny使用,能进一步缩小类型检查的范围,避免隐式类型转换掩盖问题。
你只需要在tsconfig.json里配置:
{ "compilerOptions": { "noImplicitAny": true, "strictNullChecks": true, // 也可以直接开启"strict": true,一次性启用所有严格模式选项 } }
2. 使用ESLint规则直接检测(推荐)
这是最直接有效的方案,通过ESLint的@typescript-eslint/no-floating-promises规则,能在你未处理Promise时直接抛出错误。比如你写:
const myObject = getSomething(); // 未加await,也未处理Promise
ESLint会立刻提示你:Promise must be handled appropriately,直接把问题扼杀在编码阶段。
配置步骤:
- 安装依赖:
npm install --save-dev @typescript-eslint/eslint-plugin @typescript-eslint/parser
- 在
.eslintrc.json中配置规则:
{ "parser": "@typescript-eslint/parser", "plugins": ["@typescript-eslint"], "rules": { "@typescript-eslint/no-floating-promises": "error" } }
另外,你还可以搭配@typescript-eslint/no-misused-promises规则,它会检测你把Promise当作非Promise类型使用的场景(比如在if条件中直接使用Promise),进一步强化类型检查。
总结
虽然TypeScript没有专门的编译选项,但结合严格模式编译选项+ESLint的类型规则,完全可以做到提前检测未await Promise的问题,避免后续的运行时错误。其中@typescript-eslint/no-floating-promises是最推荐的方案,能直接精准提示你遗漏await的情况。
内容的提问来源于stack exchange,提问作者laurent
相关产品推荐
相关产品推荐

