Typescript 正确的元组返回类型以避免非空/未定义运算符?

Typescript 正确的元组返回类型以避免非空/未定义运算符?,typescript,Typescript,我有一个函数,它为承诺返回已解析结果和捕获错误的元组: 函数resultOf(promise:promise):promise{ 回报承诺 .然后((数据:T):[null,T]=>[null,data]) .catch((错误:任意)=>[err]) ; } 现在,当我调用函数并检查元组是否包含错误时,如果没有错误,我希望不需要非null断言运算符: /。。。 const[error,result]=等待resultOf(foo()); 如果(错误){ //处理错误 返回承诺。拒绝(错误);

我有一个函数,它为承诺返回已解析结果和捕获错误的元组:

函数resultOf(promise:promise):promise{
回报承诺
.然后((数据:T):[null,T]=>[null,data])
.catch((错误:任意)=>[err])
;
}
现在,当我调用函数并检查元组是否包含错误时,如果没有错误,我希望不需要非null断言运算符:

/。。。
const[error,result]=等待resultOf(foo());
如果(错误){
//处理错误
返回承诺。拒绝(错误);
}

常数条=result.bar;// Typescript不会跟随这些“纠缠”变量来查看它们如何相互影响。您可以使用元组本身,并根据长度区分元组并集,然后在以下情况下进行分解:

function resultOf<T>(promise: Promise<T>): Promise<[null, T] | [any]> {
  return promise
    .then((data: T): [null, T] => [null, data])
    .catch((err: any) => [err])
  ;
}

async function x() {
  const r = await resultOf(Promise.resolve({ bar: 1 }));
  if (r.length == 1) {
    // handle error
    return Promise.reject(r[0]);
  }
  var [_, result] = r;
  const bar = result.bar; // <- Ok now
}
函数resultOf(promise:promise):promise{
回报承诺
.然后((数据:T):[null,T]=>[null,data])
.catch((错误:任意)=>[err])
;
}
异步函数x(){
const r=wait resultOf(Promise.resolve({bar:1}));
如果(r.length==1){
//处理错误
退货承诺。拒绝(r[0]);
}
var[_,结果]=r;

const bar=result.bar;//
error
result
似乎彼此独立。因此,typescript无法知道函数将返回一个或另一个为非空或未定义。元组的类型推断没有那么深入

我想我会写第一个如果

if (!result) {
  //...
}

if
结果
后面的将被定义,并且肯定非空。
错误
仍然是承诺中的任何类型。

不幸的是,这意味着问错了问题(我之所以拒绝,是因为错误,而不是因为结果是错误的-即使结果是相同的)然后我会考虑使用非空操作符来解决问题。当然,谢谢。那么非空运算符就是正确的解决方案。也许你也可以考虑创建一个DigcCalt错误类型,返回一个类似于UNION的承诺,然后检查错误类型。当然,所有的事情都比简单的非零O更有效。的确,这是个好主意。不幸的是,我必须处理各种外部库,所以我无法控制我在任何地方遇到的错误类型。我想我可以考虑为内部和外部调用创建一个resultOf版本。我只是想,因为TS已经变得非常强大,并且现在可以找出许多依赖项可能有一种方法,但我遗漏了一些东西;-)谢谢,这确实有效,但它会引入额外的代码,并使代码不那么清晰imho-我正在检查是否有错误,即使数组长度指示是否有错误,这将更隐含,因此更难阅读imho。谢谢,t霍夫!