【TypeScript】void型とnever型の違い

JavaScript

void型とnerver型の違い、の結論

void型は『なにも返さない』を表現する型、never型は『けっして起こりえないこと』を表現する型。

メソッドの戻り値においてvoid型は『正常終了時になにも値を返さないメソッド』を表現するのに対し、never型は『正常終了しないのでなにも返ってこないメソッド』を表現する。

void型について

void型とは『なにも返さない』を表現する型です。
値を返さないメソッドの戻り値の型として主に利用されます。

void型の具体例

void型の具体例について紹介します。

returnがないメソッドの戻り値

const hello = () => {
  console.log('hello')
}
// const hello: () => void

returnでなにも値を返さないメソッドの戻り値

const hello = () => {
  console.log('hello')
  return
}
// const hello: () => void

undefinedを返すメソッドの戻り値

void型にはundefinedが含まれているため、undefinedを返すメソッドの戻り値はvoid型といえます。

const hello = (): void => {
  console.log('hello')
  return undefined
}
// const hello: () => void

never型について

never型とは『けっして起こりえないこと』を表現する型です。
決して発生しない事象に対してnever型が付与されるので、never型にはどんな値もセットできません。
never型は、どんな値でもセットできるany型やunknown型とは逆の挙動になります。

never型の具体例

never型の具体例について紹介します。

絶対に実行されないブロック内の変数

never型は『けっして起こりえないこと』を表現する型であるため、絶対に実行されないブロック内の変数はnever型になります。

const foo = true;

if (foo) {
  foo; // const foo: true
} else {
  foo; // const foo: never
}

無限ループのメソッドの戻り値

戻り値がvoid型のメソッドは『正常終了時になにも値を返さないメソッド』と言い換えられます。
一方、戻り値がnever型のメソッドは『正常終了しないのでなにも返ってこないメソッド』と言い換えられます。

例えば無限ループのメソッドはいつになってもなにも返ってこない(正常終了しない)ため、never型のメソッドとなります。

const infiniteHello = () => {
  while (true) {
    console.log('Hello, world!');
  }
}
// const infiniteHello: () => never

例外を投げるだけのメソッドの戻り値

常に例外を投げるメソッドは正常終了という概念がないため戻り値はnever型になります。

const panic = (message: string) => {
  throw new Error(message)
}
// const panic: (message: string) => never

さいごに

TypeScriptにおけるnever型の具体的な利用例の詳細解説はTypeScriptでのnever型の利用例(網羅性チェックとUnion型のフィルタリング)で紹介しています。

Twitter(@nishina555)やってます。フォローしてもらえるとうれしいです!