我已阅读this,但目前尚不清楚'从未'之间的区别。和'无效'类型?
答案 0 :(得分:20)
为了增加Lee的非常好的答案,另一种思考方式是,在正确类型的程序中,window.rootViewController
值不能被观察到。
除了永不返回的函数(或者总是抛出异常的函数)之外,当联合类型已经用完所有可能的组成部分时,你会看到never
类型:
never
答案 1 :(得分:19)
在命令式语言中,void
可以被认为是包含单个值的类型。这些语言不提供构造或使用此值的方法,但void
函数可以被认为是返回这个微不足道的值。
相反,never
是一个不包含值的类型,这意味着具有此返回类型的函数根本无法正常返回。这意味着抛出异常或未能终止。
答案 2 :(得分:6)
此外,对于更多理论原因,使用--strictNullChecks
新标记,TypeScript需要一个新的底部类型(因为null
和undefined
不再存在) 。类型never
是底部类型,使TypeScript的类型系统更加一致。
答案 3 :(得分:2)
Promise.reject()
的返回类型为Promise<never>
,表示“永远不会解决”。
因此,如果函数返回Promise<never>
,我认为它只会返回错误。另一方面,Promise<void>
可能无法解决。
答案 4 :(得分:2)
简而言之:
void
返回void
,never
永不返回。
答案 5 :(得分:2)
如Marius Schulz discusses in this文章
- 一个未明确返回值的函数隐式返回在JavaScript中的值
undefined
。尽管我们通常说这样的函数“什么也不返回”,但它会返回。在这些情况下,我们通常忽略返回值。推断此类函数在TypeScript中具有void
返回类型。- 具有
never
返回类型的函数永远不会返回。 它不返回undefined
。该函数没有正常完成,这意味着它会引发错误或根本无法完成运行。
答案 6 :(得分:1)
从不是该特定部分不可访问的信息。例如,在这段代码中,
function do(): never {
while (true) {}
}
您有一个无限循环,我们不想迭代无限循环。就这么简单。
但是一个真正的问题是,它对我们有什么用? 例如,在创建更多高级类型以指向不是
时可能会有所帮助例如,让我们声明我们自己的NonNullable类型:
type NonNullable<T> = T extends null | undefined ? never : T;
在这里,我们正在检查T是否为null或未定义。如果是这样,那么我们指出它永远都不会发生。然后在使用此类型时:
let value: NonNullable<string>;
value = "Test";
value = null; // error
无效是这种类型的函数不返回任何值的信息,但是它们可以访问并且可以使用。