使用打字稿中的if语句删除空检查

时间:2019-04-29 13:05:34

标签: typescript

具有以下代码:

function A(arg1?: string, arg2?: number) {
  if (!arg1 && !arg2) {
    throw new Error('At least one of two parameters must be present');
  }
  B(arg1 || arg2);
}

function B(arg3: string | number) {
  // does something. we don't really care
}

Typescript为表达式B(arg1 || arg2)引发以下编译错误:

  

'string |类型的参数编号未定义”不能分配给   类型'string |的参数数字”。

     

类型'undefined'不能分配给类型'string |数'。 ts(2345)

但是,在函数A中,我确保至少有一个参数未定义,在这种情况下会引发错误。这意味着在表达式B(arg1 || arg2)中,参数永远不会是未定义的,它将始终是数字或字符串。

我的假设有问题吗?有什么办法可以使打字稿理解它?

2 个答案:

答案 0 :(得分:6)

如果您对单个值进行真实检查,则TS确实可以正确推断出该值不再是未定义的

AC_OUTPUT([QT5BIN_PATH])

但是,当您检查两个变量时,TS不确定它们中的每个变量是否真实,因此if (arg1) { arg1; // arg1: string } arg1仍然是arg2string | undefined分别。

一个选择是将number | undefined赋给if语句之前的变量,以便正确推断正确进行。

arg1 || arg2

答案 1 :(得分:2)

在类型检查器无法得出结论的情况下,可以使用新的!后缀表达式运算符来断言其操作数是非null且未定义的。

What's new

如果您确定至少有一个args不是undefined,则可以使用!这样的语法:

function A(arg1?: string, arg2?: number) {
  if (!arg1 && !arg2) {
    throw new Error('At least one of two parameters must be present');
  }
  B(arg1! || arg2!); // In compile time `arg1` and `arg2` are not `undefined`, in runtime maybe, but you sure the case  never come true :)
}

function B(arg3: string | number) {
  // does something. we don't really care
}