微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

数组的条件类型在解构时提供错误或泛型

如何解决数组的条件类型在解构时提供错误或泛型

在我的 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()}`);
}

Playground link

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?