Typescript 为什么类型检查器允许此代码?

Typescript 为什么类型检查器允许此代码?,typescript,Typescript,这样的代码通过类型检查可以吗 function infiniteLoop(): never { while (true) { } } let x = infiniteLoop(); x如何存在并因此居住在从不类型中 从不是一种类型。任何变量都可以具有此类型(因为任何变量都可以具有任何类型)。因此,当您说让x=infiniteLoop()时,Typescript推断x具有类型从不。非常好 但是,这也是它有用的地方,它阻止您以后使用x。这才是真正的语义错误 有关更多示例,请参见 更

这样的代码通过类型检查可以吗

function infiniteLoop(): never {
    while (true) {
    }
}
let x = infiniteLoop();

x
如何存在并因此居住在
从不
类型中

从不
是一种类型。任何变量都可以具有此类型(因为任何变量都可以具有任何类型)。因此,当您说
让x=infiniteLoop()
时,Typescript推断
x
具有类型
从不
。非常好

但是,这也是它有用的地方,它阻止您以后使用
x
。这才是真正的语义错误

有关更多示例,请参见

更一般地说,您不能期望类型系统静态地处理无限循环检测。这是因为它是一个类型系统的


当您显式地给出
never
类型提示时,Typescript方法允许静态地查明不需要的行为。具体来说,它阻止您使用显式声明为非结束的计算结果(或从声明为非结束的计算返回)。

我将尝试回答自己的问题<代码>从不
。但“底部”是任何其他类型的子类型:

function f() : never
{
    return (1 as never); // but is not true for "as void".
}
底部是各种类型的居民(尽管有一些警告) 关于未固定类型),底部可用于 该类型的值应为()

因此,
InfiniteLop()
可以返回
never
,任何类型都包括
never
作为其子类型,甚至可以声明为:

让x:never;
因为它是任何其他类型的子类型,所以它们的值可以“转换”(使用
as
)到
never
。但无法将超集指定给其子集,例如
三角形
类型为
从不
-这就是我们在此处出现错误的原因:

type Shape=正方形|矩形|圆形|三角形;
函数assertNever(x:never):never{
抛出新错误(“意外对象:+x”);
}
功能区(s:形状){
开关(s.kind){
大小写为“正方形”:返回s.size*s.size;
大小写“矩形”:返回s.height*s.width;
案例“圆”:返回Math.PI*s.radius**2;
默认值:return assertNever(s);//如果缺少案例,则此处出错
}
}

“它阻止您以后使用x”。什么意思?我甚至尝试了
console.log(x)
,但没有得到任何错误。是的,
console.log
可能不是最好的示例,因为它接受任何类型,因此没有类型检查。我的意思是,类型
决不
决不会对任何其他类型进行类型检查-当您以有检查的方式使用它时。考虑到Typescript的输入机制,这是最好的选择。不像你说的那样防弹。