有没有办法告诉TypeScript如果一个变量具有一个值,那么另一个变量就不可能具有另一个值?
例如,启用--strictNullChecks
并具有两个变量isLoading: boolean
和data: Data | null
。如果是isLoading = true
,则data
永远不会是null
,但是TypeScript不知道这一点,并且在想要使用data
时会给出错误:
if (isLoading) {
return;
}
useData(data); // error data might be null
我想我也可以检查isLoading && data != null
,但是它感觉很多余,看起来很像防御性编程,这两种气味都是我在使用常规JavaScript时不必面对的。
另一种情况:
type: 'demo' | 'final' | 'alternative' | null;
data: Data | null;
isLoading: boolean;
startProcess(type: 'demo' | 'final', data: Data) => void;
如果执行以下操作,TypeScript也将抱怨:
if (isLoading) {
return;
}
if (type !== 'alternative') {
startProcess(type, data); // Type 'null' is not assignable to type '"demo" | "final"'.'"demo" | "final"'.
}
但是,我可以肯定地知道,如果type != alternative
和isLoading = false
那么type
就不会是null
。
如果我能告诉类型系统如何更好地推理,我也想避免使用!
,因为!
运算符最终可以使适当的错误消失。
这也是我尝试过的代码框:https://codesandbox.io/s/sweet-williamson-7bs9d
它看起来也有点像TypeScript中的错误,因为如果我不分解input
参数,而是直接将其与点符号一起使用,它将起作用。
答案 0 :(得分:-1)
启动TypeScript时,我有类似的问题。感觉有些局限。但是后来我意识到这正是发生错误的地方:当您认为“我敢肯定,如果a = null,那么这是不可能的”。首先,您如何确定自己的真实能力?众所周知,那些边缘情况令人毛骨悚然。其次,如果 you 确定代码将以这种方式工作,那么最好让其他可能阅读您的代码和打字稿本身的人通过添加显式检查和类型转换来确定自己。因此,我认为显式检查isLoading && data !== null
是一个好习惯。但是,如果在您的代码中这两个条件总是同时满足/不满足,则意味着体系结构不是最佳的,您可以摆脱isLoading
并仅检查数据。
TL; DR您不能做您想要的隐式逻辑,我认为这是最好的。