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

seb*_*bab 3 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
}
Run Code Online (Sandbox Code Playgroud)

Typescript对该表达式抛出以下编译错误B(arg1 || arg2)

类型'string |的参数 编号 不可分配给'string |类型的参数 数'。

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

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

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

Aro*_*ron 6

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

if (arg1) {
  arg1; // arg1: string
}
Run Code Online (Sandbox Code Playgroud)

但是,当您检查两个变量时,TS不确定它们中的每一个都是真实的,因此arg1arg2仍然是string | undefinednumber | undefined

一种选择是arg1 || arg2在if语句之前分配一个变量,以便正确推断正确进行。

function A(arg1?: string, arg2?: number) {
    const arg = arg1 || arg2; // arg: string | number | undefined
    if (arg) {
        // arg: string | number
        B(arg);
    } else {
        throw new Error('At least one of two parameters must be present');
    }
}

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