打字稿中的never和void有什么区别?

时间:2016-06-19 18:50:25

标签: typescript

我已阅读this,但目前尚不清楚'从未'之间的区别。和'无效'类型?

7 个答案:

答案 0 :(得分:20)

为了增加Lee的非常好的答案,另一种思考方式是,在正确类型的程序中,window.rootViewController不能被观察到。

除了永不返回的函数(或者总是抛出异常的函数)之外,当联合类型已经用完所有可能的组成部分时,你会看到never类型:

never

答案 1 :(得分:19)

在命令式语言中,void可以被认为是包含单个值的类型。这些语言不提供构造或使用此值的方法,但void函数可以被认为是返回这个微不足道的值。

相反,never是一个不包含值的类型,这意味着具有此返回类型的函数根本无法正常返回。这意味着抛出异常或未能终止。

答案 2 :(得分:6)

此外,对于更多理论原因,使用--strictNullChecks新标记,TypeScript需要一个新的底部类型(因为nullundefined不再存在) 。类型never是底部类型,使TypeScript的类型系统更加一致。

答案 3 :(得分:2)

Promise.reject()的返回类型为Promise<never>,表示“永远不会解决”。

因此,如果函数返回Promise<never>,我认为它只会返回错误。另一方面,Promise<void>可能无法解决。

答案 4 :(得分:2)

简而言之:

void返回voidnever永不返回。

答案 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

无效是这种类型的函数不返回任何值的信息,但是它们可以访问并且可以使用。