查找可强制消费函数返回值的TypeScript或ESlint规则
强制消费函数返回值的规则实现方案
可用规则及配置
你可以通过@typescript-eslint系列ESLint规则配合针对性配置,实现你要的校验效果:
- 基础校验规则:
@typescript-eslint/no-unused-expressions
该规则会直接拦截无消费的独立函数调用语句,仅允许将返回值赋值给变量、作为其他函数参数、参与表达式运算的调用写法。ESLint配置示例如下:
{ "plugins": ["@typescript-eslint"], "rules": { "@typescript-eslint/no-unused-expressions": ["error", { // 禁止短路表达式作为独立语句,避免绕过校验 "allowShortCircuit": false, // 禁止三元表达式作为独立语句 "allowTernary": false, // 禁止标签模板作为独立语句 "allowTaggedTemplates": false }] } }
- neverthrow/ts-results场景强化
如果仅需要对返回Result类型的函数做强制消费校验,可以使用eslint-plugin-neverthrow插件,配置后仅会拦截返回Result类型的无消费调用,不会影响普通无返回值函数的调用。
如果你需要手动标记某类函数必须消费返回值,也可以给返回值加专属标记类型:
// 定义带标记的Result类型 type MandatoryResult<T, E> = { __mandatory: true } & Result<T, E> // 函数返回该类型时,调用必须消费返回值 const updateUser: (id: number) => MandatoryResult<void, Error> = (id) => { // 实现逻辑 }
校验效果匹配
- 可通过校验的写法:
// 赋值存储返回值 const a = getNum() // 返回值作为参数传入其他函数 console.log(getNum()) // 主动标注忽略返回值(明确豁免) void getNum() // Result类型正常处理 const res = updateUser(1) if (res.isErr()) { // 错误处理逻辑 }
- 会被拦截的写法:
// 直接调用无任何返回值消费 getNum() // 返回Result类型的函数直接调用无处理 updateUser(1)
内容的提问来源于stack exchange,提问作者Tom Cuypers
相关产品推荐
相关产品推荐

