🪡
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