
[英]Why can't typescript infer tuple return type in RxJs stream?
[英]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.