TypeScriptでArray.prototype.filterを使って特定の種類の要素を除去する際の注意点

2024-04-02

TypeScriptでArray.prototype.filterを使って特定の種類の要素を除去するには、いくつか方法があります。

ジェネリック型とunknown型

この方法は、ジェネリック型とunknown型を使って、フィルター関数の引数に型ガードを追加します。

function filterOutNumbers<T>(arr: Array<T | number>): Array<T> {
  return arr.filter((item): item is T => typeof item !== 'number');
}

const arr: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr = filterOutNumbers(arr); // ["a", "b"]

as演算子

function filterOutNumbers<T>(arr: Array<T | number>): Array<T> {
  return arr.filter((item) => {
    const itemAsT = item as T;
    return typeof itemAsT !== 'number';
  });
}

const arr: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr = filterOutNumbers(arr); // ["a", "b"]

instanceof演算子

class MyClass {}

function filterOutMyClass<T>(arr: Array<T | MyClass>): Array<T> {
  return arr.filter((item) => !(item instanceof MyClass));
}

const arr: (string | MyClass)[] = ['a', new MyClass(), 'b'];
const filteredArr = filterOutMyClass(arr); // ["a", "b"]

型エイリアス

type NotNumber<T> = T extends number ? never : T;

function filterOutNumbers<T>(arr: Array<NotNumber<T>>): Array<T> {
  return arr.filter((item) => true);
}

const arr: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr = filterOutNumbers(arr); // ["a", "b"]

上記の方法のどれを選択しても、Array.prototype.filterを使って特定の種類の要素を除去することができます。




// ジェネリック型と`unknown`型

function filterOutNumbers<T>(arr: Array<T | number>): Array<T> {
  return arr.filter((item): item is T => typeof item !== 'number');
}

const arr1: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr1 = filterOutNumbers(arr1); // ["a", "b"]

// `as`演算子

function filterOutNumbers<T>(arr: Array<T | number>): Array<T> {
  return arr.filter((item) => {
    const itemAsT = item as T;
    return typeof itemAsT !== 'number';
  });
}

const arr2: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr2 = filterOutNumbers(arr2); // ["a", "b"]

// `instanceof`演算子

class MyClass {}

function filterOutMyClass<T>(arr: Array<T | MyClass>): Array<T> {
  return arr.filter((item) => !(item instanceof MyClass));
}

const arr3: (string | MyClass)[] = ['a', new MyClass(), 'b'];
const filteredArr3 = filterOutMyClass(arr3); // ["a", "b"]

// 型エイリアス

type NotNumber<T> = T extends number ? never : T;

function filterOutNumbers<T>(arr: Array<NotNumber<T>>): Array<T> {
  return arr.filter((item) => true);
}

const arr4: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr4 = filterOutNumbers(arr4); // ["a", "b"]

このコードを実行すると、以下の結果が出力されます。

["a", "b"]
["a", "b"]
["a", "b"]
["a", "b"]

実行環境

  • TypeScript 4.7.4

注意事項

  • コードを実際に使用する場合は、必要に応じて修正してください。



TypeScriptでArray.prototype.filterを使って特定の種類の要素を除去する方法

includes method

この方法は、includes methodを使って、特定の種類の要素を含む要素を除去します。

function filterOutNumbers(arr: Array<string | number>): Array<string> {
  return arr.filter((item) => ![1, 2, 3].includes(item));
}

const arr: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr = filterOutNumbers(arr); // ["a", "b"]

reduce method

function filterOutNumbers(arr: Array<string | number>): Array<string> {
  return arr.reduce((acc, item) => {
    if (typeof item !== 'number') {
      acc.push(item);
    }
    return acc;
  }, []);
}

const arr: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr = filterOutNumbers(arr); // ["a", "b"]

for loop

function filterOutNumbers(arr: Array<string | number>): Array<string> {
  const filteredArr: Array<string> = [];
  for (const item of arr) {
    if (typeof item !== 'number') {
      filteredArr.push(item);
    }
  }
  return filteredArr;
}

const arr: (string | number)[] = ['a', 1, 'b', 2];
const filteredArr = filterOutNumbers(arr); // ["a", "b"]

typescript


Angular、TypeScript、Ionic2で同じ名前のクラスをインポートする方法

別名を使用する最も簡単な方法は、それぞれのクラスに別名を付けることです。名前空間を使用すると、異なるモジュールで同じ名前のクラスを使用することができます。モジュールエイリアスを使用すると、モジュール名の省略形を定義することができます。アンビエント宣言を使用すると、外部モジュールの型情報を TypeScript に提供することができます。...


カスタムコンポーネントと JSX で HTML を拡張:React、TypeScript、TSX を使った実践ガイド

HTML 要素は、Web アプリケーションの基盤となるものです。しかし、標準の HTML 要素では、常に必要な機能が提供されているわけではありません。そのような場合、HTML 要素を拡張することで、アプリケーションに必要な機能を追加することができます。...


TypeScript、TypeScript-typings、ts-nodeにおける型定義ファイル(.d.ts)の取り扱い

この文書では、TypeScript、TypeScript-typings、ts-node における型定義ファイル(.d.ts)の取り扱いに関する問題と解決策について解説します。問題TypeScript コンパイラ tsc を使用してプロジェクトをコンパイルすると、型定義ファイル(.d.ts)が正しく処理され、型エラーなくコンパイルが完了します。しかし、ts-node を使用して同じプロジェクトを実行すると、型定義ファイルが無視され、型エラーが発生することがあります。...


React、TypeScript、Formikでスムーズなフォーム開発!Formik onSubmit 関数が機能しない時のトラブルシューティングガイド

以下では、onSubmit 関数が機能しないという問題を解決するためのヒントとガイダンスを提供します。基本的な問題の確認まず、以下の基本的な問題を確認してください。Formik コンポーネントを正しくレンダリングしているか: <Formik> コンポーネントが正しくレンダリングされていることを確認してください。...


TypeScriptで「Type 'null' is not assignable to type 'T'」エラーが発生する理由と解決方法

TypeScriptは静的型付け言語であるため、変数やプロパティの型を事前に定義する必要があります。例えば、以下のように T 型の変数 x を定義できます。このとき、x に代入できる値は T 型の値のみです。しかし、null はどの型にも属さないため、x に null を代入しようとすると、上記のエラーが発生します。...