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

`never` 类型可以分配给 `number` 吗?

如何解决`never` 类型可以分配给 `number` 吗?

我正在写一些关于 TypeScript 的文档,我正在谈论 never 关键字的可能用途,其中一个是详尽的检查,as described here:

我有一些这样的代码


type PossibleStrings = 'foo' | 'bar' | 'chaz'; 


function fail() : never {
    throw new Error("This endpoint should never be reached");
}

function usesstring(value: PossibleStrings) : number {
    if (value === 'foo') {
        return 1
    }; 

    if (value === 'bar') {
        return 2
    }; 

    return fail();
}

Playground

现在我预计这会产生错误,因为您不应该能够从此函数返回 never 类型。

实际上,如果我们把它去掉,看起来这个函数可以返回一个 never 类型:

type PossibleStrings = 'foo' | 'bar' | 'chaz'; 


function fail() : never {
    throw new Error("This endpoint should never be reached");
}

function usesstring(value: PossibleStrings) : number {
  return fail();
}

Playground

好像……坏了。这是怎么回事?

编辑:答案是right in the documentation

never 类型是每个类型的子类型,并且可以赋值给所有类型;然而,没有任何类型是 never 的子类型或可以赋值给 never 类型(除了 never 本身)。甚至 any 也不能赋值给 never。

有没有办法改变这种行为,或者让这段代码按照我想要的方式行事? IE。我希望 return fail() 只有在所有其他分支都用尽时才有效。

解决方法

解决方案是使用fail函数的参数,而不是依赖fail函数的返回类型导致编译时错误。

type PossibleStrings = 'foo' | 'bar' | 'chaz'; 


function fail(value: never) : never {
    throw new Error("This endpoint should never be reached");
}

function usesString(value: PossibleStrings) : number {
    if (value === 'foo') {
        return 1
    } 

    if (value === 'bar') {
        return 2
    }

    return fail(value); //Argument of type 'string' is not assignable to parameter of type 'never'.(2345)

}

Sandbox

当彻底检查可能的值时,这不再导致编译时错误。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 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”。这是什么意思?