如何解决数组的条件类型在解构时提供错误或泛型
在我的 Typescript 项目中,我有一个从函数返回的结果类型,包含错误或一些数据。它可以是 [Error,null]
或 [null,Data]
形式。例如:
type Result<Data> = [ Error | null,Data | null ]
function randomSuccess(): Result<string> {
if ( Math.random() > 0.5 ) {
return [ null,'success' ]
else {
return [ new Error( 'oh no' ),null ]
}
}
const [ err,result ] = randomSuccess()
if ( err ) {
.... // can Now handle the extracted error and result
我希望 Typescript 检查错误或数据中只有一个不为空。例如:
...
return [ new Error( 'oh no' ),'success' ]
我为此编写类型的最初尝试是使用条件类型:
type Result<Data> = null extends Error ? [ null,Data ] : [ Error,null ]
当函数返回错误时,这编译得很好。但是,当返回有效数据时 - 例如 return [ null,'success' ]
- 编译器会抱怨:
类型 'null' 不能分配给类型 'Error'
我想我理解编译器错误:在我的类型定义中,Error
不是参数,所以 null extends Error
将始终为 false。但是我不知道从哪里开始。
我怎样才能创建一个要么是 [Error,null]
要么是 [null,Data]
而永远不会是 [Error,Data]
的类型?
解决方法
您正在寻找一个 union type,其中联合的部分是代表两种可能状态的两个元组(数组):
type Result<Data> =
[ null,Data ] // Success
|
[ Error,null ]; // Failure
Result<Data>
可以要么具有一种形式或另一种形式,但不能在两个地方都有 null
,也不能有 Error,Data
。 (也不能有 2 以外的长度。)
这是一个例子:
type Result<Data> =
[ null,null ]; // Failure
function random(): Result<Date> {
// ^^^^−−−− Using `Date` for the `Data` type argument
// just for example
if (Math.random() < 0.5) {
// Fail
return [new Error(),null];
}
// Succeed
return [null,new Date()];
}
const a = random();
if (a[0]) {
// TypeScript now knows that `a[0]` is an `Error`
console.log(`Error: ${a[0].message}`);
} else {
// TypeScript now knows that `a[1]` is a `Date`
console.log(`Success at ${a[1].toString()}`);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。