如何告诉打字稿不同变量的值是相关的?

时间:2019-12-02 13:14:46

标签: typescript typescript-typings

有没有办法告诉TypeScript如果一个变量具有一个值,那么另一个变量就不可能具有另一个值?

例如,启用--strictNullChecks并具有两个变量isLoading: booleandata: 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 != alternativeisLoading = false那么type就不会是null

如果我能告诉类型系统如何更好地推理,我也想避免使用!,因为!运算符最终可以使适当的错误消失。

这也是我尝试过的代码框:https://codesandbox.io/s/sweet-williamson-7bs9d

它看起来也有点像TypeScript中的错误,因为如果我不分解input参数,而是直接将其与点符号一起使用,它将起作用。

1 个答案:

答案 0 :(得分:-1)

启动TypeScript时,我有类似的问题。感觉有些局限。但是后来我意识到这正是发生错误的地方:当您认为“我敢肯定,如果a = null,那么这是不可能的”。首先,您如何确定自己的真实能力?众所周知,那些边缘情况令人毛骨悚然。其次,如果 you 确定代码将以这种方式工作,那么最好让其他可能阅读您的代码和打字稿本身的人通过添加显式检查和类型转换来确定自己。因此,我认为显式检查isLoading && data !== null是一个好习惯。但是,如果在您的代码中这两个条件总是同时满足/不满足,则意味着体系结构不是最佳的,您可以摆脱isLoading并仅检查数据。

TL; DR您不能做您想要的隐式逻辑,我认为这是最好的。