如何解决`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();
}
现在我预计这会产生错误,因为您不应该能够从此函数返回 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();
}
好像……坏了。这是怎么回事?
编辑:答案是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)
}
当彻底检查可能的值时,这不再导致编译时错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。