具有以下代码:
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)
中,参数永远不会是未定义的,它将始终是数字或字符串。
我的假设有问题吗?有什么办法可以使打字稿理解它?
答案 0 :(得分:6)
如果您对单个值进行真实检查,则TS确实可以正确推断出该值不再是未定义的
AC_OUTPUT([QT5BIN_PATH])
但是,当您检查两个变量时,TS不确定它们中的每个变量是否真实,因此if (arg1) {
arg1; // arg1: string
}
和arg1
仍然是arg2
和string | undefined
分别。
一个选择是将number | undefined
赋给if语句之前的变量,以便正确推断正确进行。
arg1 || arg2
答案 1 :(得分:2)
在类型检查器无法得出结论的情况下,可以使用新的!
后缀表达式运算符来断言其操作数是非null且未定义的。
如果您确定至少有一个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
}