@typescript-eslint/no-unused-vars对仅用于泛型的参数报错如何解决?
问题:@typescript-eslint/no-unused-vars 针对仅用于泛型的参数报错
我在函数中添加了一个用于确定返回类型的参数,用来指定初始化器加载的API是否始终包含数据,简化示例代码如下:
interface CanBeUndefined { data: [] | undefined; } interface AlwaysHasData { data: []; } interface Query {} const query: Query = {}; const canBeUndefined = parseQuery(query, true); const cannotBeUndefined = parseQuery(query, false); function parseQuery<TCouldBeUndefined extends boolean>( query: Query, couldBeUndefined: TCouldBeUndefined // 此处触发@typescript-eslint/no-unused-vars报错 ) { // 处理query逻辑 return query as TCouldBeUndefined extends true ? CanBeUndefined : AlwaysHasData; }
问题在于,couldBeUndefined参数仅用于泛型类型推断,未在函数内部被运行时代码使用,因此触发了@typescript-eslint/no-unused-vars规则的报错。我需要无需禁用该规则的解决办法,同时想了解该场景是否应该被该规则兼容。
无需禁用规则的解决办法
1. 为参数添加下划线前缀
@typescript-eslint/no-unused-vars规则默认会忽略以下划线开头的未使用参数,这是社区普遍认可的处理方式,既保留参数用于泛型推断的作用,又不会触发报错:
function parseQuery<TCouldBeUndefined extends boolean>( query: Query, _couldBeUndefined: TCouldBeUndefined ) { // 处理query逻辑 return query as TCouldBeUndefined extends true ? CanBeUndefined : AlwaysHasData; }
2. 显式指定泛型参数,移除函数的第二个参数
调用函数时直接指定泛型类型,这样可以彻底去掉未使用的参数,不过会增加调用代码的复杂度:
// 修改后的函数 function parseQuery<TCouldBeUndefined extends boolean>( query: Query ) { // 处理query逻辑 return query as TCouldBeUndefined extends true ? CanBeUndefined : AlwaysHasData; } // 调用方式 const canBeUndefined = parseQuery<true>(query); const cannotBeUndefined = parseQuery<false>(query);
3. 在函数内部“无意义”地引用参数(不推荐)
添加一行不影响逻辑的代码来引用参数,让规则认为参数已被使用,但这种方式属于hack手段,会增加冗余代码:
function parseQuery<TCouldBeUndefined extends boolean>( query: Query, couldBeUndefined: TCouldBeUndefined ) { void couldBeUndefined; // 仅用于规避未使用参数报错 // 处理query逻辑 return query as TCouldBeUndefined extends true ? CanBeUndefined : AlwaysHasData; }
关于场景兼容性的说明
当前@typescript-eslint/no-unused-vars规则没有内置针对“参数仅用于泛型推断”场景的豁免逻辑,因为从运行时角度看该参数确实未被使用。不过下划线前缀的处理方式是规则默认支持的,也是社区应对这类场景的标准方案。
内容的提问来源于stack exchange,提问作者rasmusrim
相关产品推荐
相关产品推荐

