【问题标题】:How to tell typescript that the values of different variables are related?如何告诉打字稿不同变量的值是相关的?
【发布时间】:2020-03-27 02:38:30
【问题描述】:

有没有办法告诉 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 参数,而是直接使用点表示法,它就可以工作。

【问题讨论】:

    标签: typescript typescript-typings


    【解决方案1】:

    当我开始使用 TypeScript 时,我也有类似的问题。感觉有点拘束。但后来我意识到这正是错误发生的地方:当你认为“我确定如果 a=null 那么这个和那个是不可能的”。首先,你能确定多少?众所周知,有一些边缘情况。其次,如果确定代码会以这种方式工作,那么通过添加显式检查和类型转换让可能阅读你的代码和打字稿本身的其他人确定是好的。所以我认为明确检查isLoading && data !== null 是一种很好的做法。但是,如果在您的代码中这两个条件总是同时满足/未满足,则意味着架构不是最佳的,您可以摆脱isLoading 并简单地检查数据。

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

    【讨论】:

    • 如果您查看提供的代码框,有一种方法可以实现(查看altMain)。关于data !== null 和所有这些,防御性编程的问题是你可以默默地捕捉到你想要发生的错误,在这种情况下,如果我得到一个isLoading = falsedata = null,我想要一个错误发生,不只是默默地进入loading... 状态。最后,我知道这个例子有点简单(为了简单起见),所以大部分时间都可以减少检查data != null,但问题更多地是在关联两个变量的方向上。
    猜你喜欢
    • 2022-11-18
    • 2016-06-13
    • 2022-01-07
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 2020-12-02
    相关资源
    最近更新 更多