【发布时间】:2021-07-14 18:20:30
【问题描述】:
在我的 Typescript 项目中,我有一个从函数返回的 Result 类型,其中包含错误或一些数据。它可以是[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 不是参数,所以null extends Error 将始终为假。但是我不知道从这里去哪里。
如何创建[Error, null] 或[null, Data] 的类型,而不是[Error, Data]?
【问题讨论】:
-
如果有人对此问题有很好的欺骗目标,请在您投票关闭时@ping我,以便我删除下面的答案。我没有找到,但在我看来它很可能就在那里。谢谢。
标签: typescript destructuring conditional-types generic-type-parameters