【发布时间】:2021-07-03 19:44:09
【问题描述】:
是否可以让其他变量充当类型保护?
假设一些这样的代码
let foo: string | null = Math.random() > .5 ? null : 'bar'
const otherProp = true
const test = foo !== null && otherProp
function foobar(x: string){}
如果我现在打电话给foobar(foo),我会假设一个警告,因为 foo 可以是 null 或字符串,并且只允许使用字符串
但如果我这样称呼它
if (test){
foobar(foo)
}
它不应该警告我,因为 test 仅在 foo 不为 null 时才为真,因此只有 string 保持为类型
这样的事情可能吗?
【问题讨论】:
-
如果您将
foo !== null检查直接放入 if 语句中,Typescript 会理解它。你不这样做有什么原因吗? -
是的。有助于可读性。在我的生产代码中,if 部分在几个地方我不想在所有地方都内联它
-
您可以使用自定义类型保护
isNotNull = <T>(x:T): x is Exclude(T, null) => x !== null,然后可以轻松地重复使用if (isNotNull(foo)) -
@VLAZ 这意味着我需要在每个 if 中调用一个函数,并且不能预先计算一次。所以这意味着更多的计算只是为了让 TS 开心似乎不是一个好的选择
-
@L.A 是的,拥有一个功能会成功,因此您每次都必须重新评估它。然而,让我们看看另一面——如果你计算一次并想使用缓存的结果,你现在有不可重用的代码。如果您需要在不同的范围内进行相同的检查,则必须重复检查。无论如何,您必须将其提取到(有效地)类型保护中才能重用它。假设你的类型守卫做了一个简单的操作,比如空检查或属性查找,它不会对性能产生影响。如果它真的很贵,你仍然可以记住守卫。
标签: typescript typescript-typings