Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 类型脚本和类型推断:验证问题_Typescript_Types - Fatal编程技术网

Typescript 类型脚本和类型推断:验证问题

Typescript 类型脚本和类型推断:验证问题,typescript,types,Typescript,Types,我目前有一个函数可以做类似的事情(为了讨论,我写了一个简单的工作示例): 但是Typescript抱怨变量可能未定义。我不喜欢将validateVariable的代码放在doSomething中,因为在我的例子中,验证是一个非常重要的函数,我需要能够重复使用。定义一个新变量,这样Typescript就不会抱怨它的类型,这也让人觉得很愚蠢,因为在验证之后,它无论如何只能拥有变量类型(代码不能通过validateVariable(variable)行,除非它没有抛出,在这种情况下,变量具有适当的类型

我目前有一个函数可以做类似的事情(为了讨论,我写了一个简单的工作示例):

但是Typescript抱怨
变量
可能未定义。我不喜欢将
validateVariable
的代码放在
doSomething
中,因为在我的例子中,验证是一个非常重要的函数,我需要能够重复使用。定义一个新变量,这样Typescript就不会抱怨它的类型,这也让人觉得很愚蠢,因为在验证之后,它无论如何只能拥有变量类型(代码不能通过
validateVariable(variable)
行,除非它没有抛出,在这种情况下,变量具有适当的类型)


这样做的好方法是什么?我愿意改变我的代码结构,因为我仍然在学习很多关于Typescript的知识,我对此很灵活

通过给
validateVariable
一个特殊的返回类型,您可以告诉typescript如果函数返回(而不是抛出),那么必须定义变量:

function validateVariable(variable: Variable | undefined): asserts variable is Variable {
  if(!variable) {
    throw new Error('Variable is undefined!')
  }
}
如果这样做,那么在调用
validateVariable(variable)
之后,
variable
上的类型将缩小为仅
variable


这听起来正是我想要的!但是我尝试在我的存储库中实现它,我得到了这样的结果:
断言要求调用目标中的每个名称都使用显式类型注释声明。
我缺少什么?我环顾四周,发现这似乎与我的
validateVariable
函数是作为箭头函数构建的这一事实有关。我可以解决这个问题(反正没有使用“this”),但有没有一个很好的理由说明为什么它不适用于箭头函数,而适用于
函数
关键字?不幸的是,这个功能似乎在Typescript 3.7之前不可用,我们的存储库仍然在Typescript 3.6.3上,所以我不能使用它。不过,这似乎是正确的做法。我会给你绿色支票,如果你有比我更好的打字选择,请告诉我
function validateVariable(variable: Variable | undefined): asserts variable is Variable {
  if(!variable) {
    throw new Error('Variable is undefined!')
  }
}