TypeScript TS2774报错正向触发反向无报错的原因及检测方案
TS2774反向判断无告警原因及检测方案
你示例中的代码整理如下:
interface A { a: () => boolean; } class AImpl implements A { public a(): boolean { return true; } } it('should fail', function () { const aImpl = new AImpl(); if (aImpl.a) { // TS2774: 该条件将始终返回true,因为此函数始终处于已定义状态,您是否是想要调用它? console.log("always true"); } }); it('why success', function () { const aImpl = new AImpl(); if (!aImpl.a) { // 无TS编译报错 console.log('always false'); } });
1. 正向判断报错、反向判断无告警的原因
TS2774是TypeScript 4.9版本引入的针对性告警规则,当前官方实现的触发条件仅覆盖了正向真值判断场景:
- 当一个不可为空的函数类型值直接作为
if的条件表达式时,TypeScript判定该条件恒真,会触发告警提示你可能漏写了调用括号 - 反向取反的场景(
!xxx、!!xxx等)目前未被纳入该规则的默认检测范围,属于现有规则的覆盖盲区,所以不会触发TS2774报错
2. 全场景检测未调用直接引用方法的方案
仅靠TypeScript内置规则无法覆盖所有漏写调用括号的场景,需要搭配ESLint + TypeScript ESLint插件实现全量检测:
开启@typescript-eslint/strict-boolean-expressions规则,该规则要求所有布尔判断位置必须传入布尔类型值,不允许直接传入函数、数字、字符串等其他类型隐式转换为布尔值。开启后不管是if (aImpl.a)还是if (!aImpl.a)都会直接报错,强制你必须显式调用函数aImpl.a(),或者显式声明你就是要判断函数是否存在(比如写typeof aImpl.a === 'function'),完全避免漏写括号的问题。
内容的提问来源于stack exchange,提问作者user17437960
相关产品推荐
相关产品推荐

