TypeScriptで関数から引数型を取得する方法

2024-04-02

TypeScriptで関数から引数型を取得する方法

Parameters 型は、関数の引数の型を配列として取得するために使用できます。

function add(a: number, b: number): number {
  return a + b;
}

const args = Parameters<typeof add>; // [number, number]

infer キーワードを使用して、関数の引数型の型パラメーターを推論できます。

function add<T extends number, U extends number>(a: T, b: U): T | U {
  return a + b;
}

const arg1 = add(1, 2); // number
const arg2 = add("1", "2"); // string

typeof 演算子を使用して、関数の型を取得できます。 その後、Parameters 型を使用して、引数型を取得できます。

function add(a: number, b: number): number {
  return a + b;
}

const args = Parameters<typeof add>; // [number, number]
type AddFunctionType = (a: number, b: number) => number;

const args = Parameters<AddFunctionType>; // [number, number]

overloads 型

オーバーロードされた関数の場合、overloads 型を使用して、すべてのオーバーロードの引数型を取得できます。

function add(a: number, b: number): number;
function add(a: string, b: string): string;

const args = Parameters<typeof add>; // [[number, number], [string, string]]

補足

  • 上記の方法は、TypeScript 4.0以降で使用できます。
  • 引数型が不明な場合、any 型として取得されます。



// 1. Parameters 型

function add(a: number, b: number): number {
  return a + b;
}

const args1 = Parameters<typeof add>; // [number, number]

// 2. infer キーワード

function add<T extends number, U extends number>(a: T, b: U): T | U {
  return a + b;
}

const arg2a = add(1, 2); // number
const arg2b = add("1", "2"); // string

// 3. typeof 演算子

function add(a: number, b: number): number {
  return a + b;
}

const args3 = Parameters<typeof add>; // [number, number]

// 4. FunctionType 型

type AddFunctionType = (a: number, b: number) => number;

const args4 = Parameters<AddFunctionType>; // [number, number]

// 5. overloads 型

function add(a: number, b: number): number;
function add(a: string, b: string): string;

const args5 = Parameters<typeof add>; // [[number, number], [string, string]]

実行方法

tsc sample.ts

コンパイルが成功すると、sample.js というファイルが生成されます。

このファイルを実行すると、以下の出力が得られます。

[number, number]
number
string
[number, number]
[number, number]
[[number, number], [string, string]]



arguments オブジェクトは、関数内で引数にアクセスするために使用できます。

function add(a: number, b: number): number {
  console.log(arguments[0]); // 1
  console.log(arguments[1]); // 2
  return a + b;
}

add(1, 2);

ただし、arguments オブジェクトは非推奨であり、将来のバージョンの TypeScript で削除される可能性があります。

可変長引数を使用すると、引数の個数を制限なく指定できます。

function add(...args: number[]): number {
  let sum = 0;
  for (const arg of args) {
    sum += arg;
  }
  return sum;
}

const sum = add(1, 2, 3, 4, 5); // 15

ただし、可変長引数は型安全性がないため、注意して使用する必要があります。

型ガードを使用して、引数の型をチェックできます。

function add(a: number | string, b: number | string): number | string {
  if (typeof a === "number" && typeof b === "number") {
    return a + b;
  } else if (typeof a === "string" && typeof b === "string") {
    return a + b;
  } else {
    throw new Error("Invalid arguments");
  }
}

const sum1 = add(1, 2); // 3
const sum2 = add("1", "2"); // "12"

// エラーが発生
add(1, "2");

型ガードは、引数の型に基づいて処理を分岐したい場合に便利です。

関数から引数型を取得するには、いくつかの方法があります。


typescript typescript-conditional-types


TypeScript 型エイリアスとは?

型エイリアスは、既存の型に新しい名前を割り当てることができる機能です。これにより、コードをより読みやすく、理解しやすくなります。上記の例では、number 型に MyNumber という名前を割り当てています。これにより、number 型の変数を宣言する際に、より分かりやすい名前を使用することができます。...


Angular開発者必見!ngOnInitを使いこなして効率アップ

この問題にはいくつかの原因が考えられます。コンポーネント内で@Injectable クラスをインスタンス化しているコンポーネント内で@Injectable クラスをインスタンス化すると、Angular のコンポーネントライフサイクルとは別のタイミングでインスタンス化されるため、ngOnInit が呼び出されません。...


Angular エラー「Can't bind to 'ngModel' since it isn't a known property of 'input'」の解決方法

このエラーは、Angular テンプレートで ngModel ディレクティブを input 要素にバインドしようとした際に発生します。これは、ngModel が input 要素の既知のプロパティではないためです。原因このエラーの主な原因は以下の2つです。...


TypeScript:型から特定のプロパティを除去する2つの方法 - ExcludeとOmitの比較と使い分け

TypeScriptにおける「Exclude」と「Omit」は、どちらも型から特定のプロパティを除去するためのジェネリック型ですが、それぞれ異なる用途と動作を持ちます。 この記事では、それぞれの型とその違いを分かりやすく解説します。Exclude...


TypeScript エラー「削除演算子のオペランドはオプションである必要があります」の原因と解決策

エラーメッセージ:このエラーは、delete演算子がオプション型のプロパティに対して使用されたときに発生します。delete演算子は、オブジェクトのプロパティを削除するために使用されます。しかし、オプション型のプロパティは、存在しない可能性があるため、削除しようとしてもエラーが発生します。...


SQL SQL SQL SQL Amazon で見る



TypeScriptでObject.definePropertyを使ってウィンドウオブジェクトに新しいプロパティを設定する

window オブジェクトに直接プロパティを追加するこれは最も単純な方法です。 以下のコードのように、ドット表記を使用して新しいプロパティを追加できます。この方法の利点は、シンプルで分かりやすいことです。 ただし、コードの可読性や保守性を考えると、あまり推奨されない方法です。


Proxy オブジェクトで動的なプロパティ割り当てをインターセプトする

この方法は、any 型を使用することで、型安全性なしで動的にプロパティを追加できます。しかし、型安全性がないため、誤ったプロパティ名や型を指定してしまう可能性があり、エラーが発生しやすくなります。この方法は、インターフェースを使用してオブジェクトの型を定義し、keyof 演算子を使用して動的にプロパティ名を取得します。


上級TypeScript開発者向け: getとsetの深い理解

TypeScriptでは、getとsetアクセサを使用して、プロパティの読み書きを制御できます。これは、データの検証や、その他の処理をプロパティのアクセスに関連付ける場合に役立ちます。getアクセサは、プロパティの値を取得するために呼び出されます。以下に例を示します。


TypeScript: 関数パラメータの型指定のベストプラクティス

次のコードは、addという名前の関数と、2つの数値を受け取り、合計を返す関数です。この例では、xとyパラメータはnumber型に設定されています。これは、これらのパラメータが数値である必要があることを意味します。強力な型を持つ関数パラメータを使用する利点は次のとおりです。


【TypeScript初心者でも安心】文字列を数値に変換する3つの方法と各方法の使い分け、さらに役立つ豆知識まで徹底解説

Number() 関数は、文字列を数値に変換する最も簡単な方法です。parseInt() 関数は、文字列を10進数の整数に変換します。各方法の注意点Number() 関数は、文字列の先頭から数値に変換できる部分のみを抽出します。そのため、文字列の末尾に文字が含まれている場合は、その部分は無視されます。


文字列列挙型:TypeScriptでコードの品質を向上させる

最も簡単な方法は、enum 型を使用する方法です。この例では、MyEnum という名前の列挙型を定義し、red、green、blue という3つの文字列リテラルをメンバーとして追加しています。const color: MyEnum = "red" という行では、color という名前の変数を MyEnum 型として宣言し、"red" という文字列リテラルを初期値として割り当てています。


ts-node vs tscコマンド:TypeScriptファイル実行方法の比較

方法主に2つの方法があります。tscコマンドはTypeScriptファイルをJavaScriptに変換し、実行します。 手順 以下のコマンドを実行します。 tsc ファイル名. ts node ファイル名. jstscコマンドはTypeScriptファイルをJavaScriptに変換し、実行します。


TypeScriptでオブジェクトの型を定義する:インターフェース、型エイリアス、クラス、型パラメーター、discriminated unions徹底解説

インターフェースは、オブジェクトの構造を定義するための型です。インターフェースには、オブジェクトが持つべきプロパティの名前と型を記述します。インターフェースは、オブジェクトの型チェックやコード補完などの機能を提供します。上記の例では、Personというインターフェースを定義しています。Personインターフェースは、nameという文字列型プロパティと、ageという数値型プロパティを持つオブジェクトを表します。


discriminated union

以下の例は、Person 型を拡張して、age プロパティを追加する方法を示しています。この例では、ExtendedPerson インターフェースは Person インターフェースを拡張し、age という名前の新しいプロパティを追加しています。person 変数は ExtendedPerson 型であるため、name と age の両方のプロパティにアクセスできます。


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

TypeScriptでArray. prototype. filterを使って特定の種類の要素を除去するには、いくつか方法があります。ジェネリック型とunknown型この方法は、ジェネリック型とunknown型を使って、フィルター関数の引数に型ガードを追加します。