尝试编写一个在发生意外“失败”时优雅返回的函数。正在考虑使用 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]
这是预期的行为吗?这是什么原因,有没有办法解决?
答案 0 :(得分:2)
它没有变成联合元组 - 它变成了两个具有联合类型的变量,因为您将结果拆分为两个变量。 Typescript 不会跟踪不同变量类型之间的依赖关系,因此您对变量 err
的类型保护不会也不能缩小变量 val
的类型。
解决方案:将函数的结果分配给单个变量而不解构,然后使用 result[0]
和 result[1]
引用其组件。