0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

TypeScript の never 型について

Last updated at Posted at 2024-02-08

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('条件に一致する要素はありませんでした。');
}
0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?