🪡

TypeScriptのnever型を知ろう

に公開

概要

別記事を書くにあたりnever型を理解しようの会

never型とは

何も代入できないものという意味。
参考: https://www.typescriptlang.org/docs/handbook/2/narrowing.html#the-never-type

never型以外のものは代入できない

const foo: never = 1 // これはできない
const bar: never = 1 as never // これはできる

↑は他の型でもそれっぽいなと思うが、never型は他のどの型にも代入できる。

const bar: never = 1 as never
const test: string = bar
const test2: number[] = bar

使いどき

値を返さない関数

function hoge(): never {
  while (true) {
    console.log('無限ループをしている')
  }
}

常にthrowされる関数

function fuga(message: string): never {
  throw new Error(message);
}

voidとの違いは??

使いどきに「値を返さない関数」と書いたが

function hoge2(): never {
  console.log('hogehoge')
}

とすると 'never' を返す関数には、到達可能なエンド ポイントがありません。 エラーになっている。
正しくは以下のように void を使う。

function hoge2(): void {
  console.log('hogehoge')
}

TypeScript Deep Driveの日本語版によると

何も返さない関数はvoidを返します。しかし、returnを返すことのない関数(または常にスローする)はneverを返します。

と記載されている。
ちょっと噛み砕くと何もreturnしなかったり明示的に書いてなくても最後まで処理が完遂したりする場合はvoid、永遠に続いたり中断されたりする場合はneverらしい。

「何もreturnしない場合」は以下の例

function hoge2(text: string): void {
  if (!text.length) {
    return
  }
  console.log(text)
}

まとめ

  • never型は「何も代入できない」「何もない」を示す型
  • 関数の永遠に続く処理や中断処理で指定されることがある

Discussion