繁体   English   中英

不能返回元组,Typescript。相反,它被解释为一个数组

[英]Can't return Tuple, Typescript. Instead it's interpreting as an Array

我正在尝试将类型安全添加到以前开发人员编写的一般 function 的返回中,并且需要语法方面的帮助:

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

这是一个非常简单的 function,它接收一个 promise,并返回一个新的 promise,其 output 类型是一个元组[Error|null, <The First Promise's Return Type>|null] 本质上,如果发生错误(else null ),第一个值将始终是错误,第二个值将是等待第一个 promise(else null )的结果。 您可以像这样使用它:

const [ err, result ] = await to(/*<API Call>*/);
if (err) {
    setError(err);
    // ...
} else if (result) {
    processApiResult(result);
    // ...
}

我知道以下是错误的( (T|null)[]不应该是“这两种类型的数组”,而是“具有特定顺序的那些类型的元组”),但我一直在反对墙 & 这是我能得到的尽可能近的地方。

export function to<T>(promise:Promise<T>):Promise<(T|null)[]|[Error, null]> {  
  return promise
    .then(data => [null, data])
    .catch(err => [err as Error, null]);
 }
 
const [ err, result ] = await to(api.changePassword(username, password));  
// const error : string | Error | null
// const result : string | null

第一个参数应该是Error | null Error | null (不是| string ),第二个是正确的string | null string | null

 function to<T>(promise:Promise<T>):Promise<[Error|null,T|null]> { return promise.then((data):[null,T] => ([null, data])).catch((err) =>( [err, null])); } async function func() { const [ err, result ] = await to<string>(new Promise(resolve => resolve)); console.log(err,result) }

如果你确定to()返回的元组不会发生变异,你可以使用const 断言来键入这个 function。

export function to<T>(promise:Promise<T>):Promise<readonly [Error | null, T | null]>  {  
  return promise
    .then(data => [null, data] as const)
    .catch(err => [err as Error, null] as const);
}

const [ err, result ] = await to(api.changePassword(username, password));  
// err: Error | null
// result: string | null

这是有效的,因为as const会将数组文字的类型转换为只读元组。

如果您出于某种原因不希望元组是只读的,那么您还可以执行以下操作:

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

const [ err, result ] = await to(api.changePassword(username, password));  
// err: Error | null
// result: string | null

无论哪种方式,您只需要告诉编译器to()返回的值是固定大小的元组,而不是 arrays。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM