【发布时间】:2020-01-16 11:32:59
【问题描述】:
我有以下打字稿代码:
type Nothing = undefined | null;
export const isNothing = <T>(val: T | Nothing): val is Nothing =>
val === null || typeof val === 'undefined';
isNothing 是一种类型保护,主要检查是否设置了值。
我想在运行前检测以下内容:
const foo:number = 42;
if(isNothing(foo)) { /* ... */ }
这里的情况是类型保护是多余的。由于foo 是显式类型的,所以它不能是null 或undefined。
我一直在尝试通过以下方式找到答案:
- 如果
val不是联合类型,则重载isNothing以返回类型never - 一些 linter 规则会在接受联合的函数的参数不是联合时进行标记(这感觉像是一种大锤方法)。
- 一些明确检测不必要的类型保护的 linter 规则
在这种情况下,“检测”可能是编译时错误或 linter 通知。重要的是,这将是一个运行前检测。
【问题讨论】:
-
“检测”的结果应该是什么?
-
@user2864740 真棒问题 - 我已经更新以澄清我的意思是“预运行时”,
tslint或tsc -
overloading到底是什么意思,所以类型保护返回never?类型保护必须返回一个布尔值。对于第二个要点:也许您的意思是将交集类型作为参数,那么所有传递的类型都必须满足指定的约束。 -
@iY1NQ,所以,我四处寻找探索的途径。通过“重载”,我的意思是,如果函数传递了非联合类型,则签名将返回
never,这将导致我的代码出错(这是我想要的)......我不'不要以为这条路会硕果累累 -
@iY1NQ 至于'也许你的意思是一个交叉口类型作为参数',我不确定你在开什么车......最终这是一个类型保护,所以它需要参加工会,对吧?
标签: typescript static-analysis