【发布时间】:2020-03-27 02:38:30
【问题描述】:
有没有办法告诉 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 参数,而是直接使用点表示法,它就可以工作。
【问题讨论】:
标签: typescript typescript-typings