如何防止元组联合变成联合元组

时间:2021-02-16 06:33:41

标签: typescript

尝试编写一个在发生意外“失败”时优雅返回的函数。正在考虑使用 go-style 函数返回 gonig,并将返回值输入为 [Val, null] | [null, Error]

但是,当尝试使用 if 语句对返回值进行类型保护时,

const [val, err] = myFunc(); // => [Val, null] | [null, Error]

if (err) {
  handle(err);
  return;
}

// At this point in code, return value has to be of type [Val, null]

doSomethingWith(val) // Error! Type 'null' is not assignable to type 'Val'

考虑到对象的类似方法工作正常,这似乎令人困惑,(Link to playground)

const res = myFunc(); // => {type: 'Error'} | {type: 'Success', data: Val}


if (res.type === 'Error') {
  handle(res);
  return;
}

// In this example, res is correctly narrowed to {type: 'Success', data: Val}

doSomethingWith(res.data)

似乎元组的联合变成了联合的元组,

来自[Val, null] | [null, Error]

[Val | null, null | Error]

这是预期的行为吗?这是什么原因,有没有办法解决?

1 个答案:

答案 0 :(得分:2)

它没有变成联合元组 - 它变成了两个具有联合类型的变量,因为您将结果拆分为两个变量。 Typescript 不会跟踪不同变量类型之间的依赖关系,因此您对变量 err 的类型保护不会也不能缩小变量 val 的类型。

解决方案:将函数的结果分配给单个变量而不解构,然后使用 result[0]result[1] 引用其组件。

相关问题