never 型は何も代入できない
公式ドキュメント
https://typescriptbook.jp/reference/statements/never
変数としてシンプルに定義した場合はその通りある。
もちろんこれは代入することができない
let a: never = 2
しかし、この型の使い道がよくわからないので
使い道を教えてもらった。
しかし、実際の場面で利用することは推奨されていないので極力使わないことを目標にしたい。
使い道:最後まで到達できない関数の戻り値として使う
何も代入できない、つまり戻り値として void を持つこともできない
故にこの関数 hoge 最後まで到達することができない関数を定義することができる
例えばエラーを発生させるための専用のメソッドなどだ。
// 戻り値が never の関数を呼ぶ場合は try catch をしようと人間がわかりやすい
function hoge(): never {
// 最後まで関数が定義できてしまう場合エラーになる
// never を戻り値にした場合コンパイラがこの関数を最後まで実行されないことを検知できる
}
メリット
- 戻り値が never の関数を呼ぶ場合は try catch をしようと人間がわかりやすい
- 最後まで関数が定義できてしまう場合エラーになるためわかりやすい
- never を戻り値にした場合コンパイラがこの関数を最後まで実行されないことを検知できる
当然利用しようとしてもエラーになる
この様に利用した時も a = 3 は到達不可能なコードとしてエラーが表示される
hoge();
let a = 3
function hoge(): never {}
使い道模索中
ざっと学びのメモをした程度なので何かあればリンクなどを貼ってもらえればと思います。
型の絞り込み(エラーハンドリング?)
こちらも現実的では無い
type Success = {
success: true;
value: number;
};
type Error = {
success: false;
errorMessage: string;
};
function getResult(): Success | never {
if (Math.random() > 0.5) {
return { success: true, value: 42 };
} else {
// 実際にはここでエラーを投げるか、Error型のオブジェクトを返すべき
throw new Error("Operation failed");
}
}
try {
const result = getResult();
console.log(result.value); // Success型のプロパティに安全にアクセスできる
} catch (error) {
console.error(error);
}
型の除外
type AllTypes = string | number | boolean;
type WithoutBoolean = Exclude<AllTypes, boolean>;
function processValue(value: WithoutBoolean) {
console.log(value);
}
processValue("test"); // OK
processValue(123); // OK
// processValue(true); // エラー: 型 'boolean' の引数を型 'string | number' への割り当て不可
活用例(無理やり使うなら)
function filterArray<T>(items: T[], predicate: (item: T) => boolean): T[] | never[] {
const result = items.filter(predicate);
if (result.length > 0) {
return result;
} else {
// 条件に一致する要素がない場合、空の配列を返す
// この時点での型は `never[]` と推論されるが、関数の戻り値の型としては `T[] | never[]` を許容
return [];
}
}
// 使用例
const numbers = [1, 2, 3, 4, 5];
const filteredNumbers = filterArray(numbers, num => num > 3);
// この時点で filteredNumbers は `number[] | never[]` 型となる
if (filteredNumbers.length > 0) {
// 型ガードにより、このブロック内では filteredNumbers は `number[]` 型として扱われる
console.log(filteredNumbers);
} else {
// 空の配列が返された場合、ここで処理を行う
console.log('条件に一致する要素はありませんでした。');
}