TypeScriptで関数から引数型を取得する方法
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