Typescript “触发”;表达永远是真实的”;辅助函数上的警告

Typescript “触发”;表达永远是真实的”;辅助函数上的警告,typescript,tslint,Typescript,Tslint,我定义了一个名为的函数,其实现方式如下: 导出函数已定义(值:T):值不可为空{ 返回值!==undefined&&value!==null; } 功能,它的工作。但是,有一件小事,我试图实现。让我们以这段代码为例: const a:number | null | undefined=1; 如果(a!==未定义&&a!==空){ //a在这里被推断为`数字'` ... 如果(a!==未定义){ //^^^^^^^^^^^^^^^tslint/eslint将抛出以下警告: //“表达式始终为真。

我定义了一个名为
的函数,其实现方式如下:

导出函数已定义(值:T):值不可为空{ 返回值!==undefined&&value!==null; }
功能,它的工作。但是,有一件小事,我试图实现。让我们以这段代码为例:

const a:number | null | undefined=1;
如果(a!==未定义&&a!==空){
//a在这里被推断为`数字'`
...
如果(a!==未定义){
//^^^^^^^^^^^^^^^tslint/eslint将抛出以下警告:
//“表达式始终为真。(严格类型谓词)”
}
}
由于我已经检查了是否定义了,lint将抛出一个警告,再次声明将是多余的

如果我尝试将其替换为
isDefined
,则不会引发任何警告:

if(定义为(a)){
//a在这里被推断为`数字'`
...
如果(定义为(a)){
//林特什么也不扔
}
}
我无法在codesandbox中复制它,因为我无法配置eslint,但代码如下:

导出函数已定义(值:T):值不可为空{ 返回值!==undefined&&value!==null; } 函数linterWillThrowWarning(值:T | null |未定义){ if(值!==null&&value!==未定义){ 如果(值!==null){ console.log(值); } } } 函数linteronthrowwarning(值:T | null |未定义){ 如果(已定义(值)){ if(isDefined(value)){//(我希望它抛出) console.log(值); } } }
这可能超出了过梁的能力。我不确定它是否从TS获取类型信息,以便知道您正在缩小已经缩小的类型。第一个版本可以静态分析,但后一个版本需要编译器可用的知识;也不知道它是确定性的(用户定义的类型保护不需要是纯的或确定性的)。第二次调用返回不同的结果是不寻常的,但并非不可能的,即使对
isDefined
的两次调用之间没有可能更改
value
@kaya3您确定林特完全了解类型防护装置吗?@VLAZ,这取决于林特
eslint
大概不会,
tslint
可能(我不使用它,所以我不能真正说),问题说的是一个,但标签说的是另一个。如果linter不知道类型防护装置,则同样的问题也适用;它不能假设对具有相同参数的同一函数的调用将返回相同的结果,并且不会产生副作用。@kaya3好吧,TSLint已经停止,取而代之的是ESLint。我的印象是,这两个版本将具有类似的特性,从TSLint到ESLint的编译器信息被删除似乎是一个巨大的降级。因此,我怀疑两者都没有真正考虑类型系统。但我真的不熟悉TSLint,所以我可能错了。我相当确信,ESLint只对从文件解析的AST进行静态分析,不考虑其他细节。