1. ホーム
  2. typescript

[解決済み] Typescriptで関数から引数の型を取得する方法 [重複]について

2022-04-27 08:24:04

質問

ドキュメントで何か見逃しているかもしれませんが、typescriptで関数内のパラメータの型を取得する方法が見つかりません。 つまり、ある関数

function test(a: string, b: number) {
    console.log(a);
    console.log(b)
}

型にアクセスしたい stringnumber のように、タプルである可能性が高い。

関数自体の型を取得できることは知っています。 typeof test または、戻り値の型は ReturnType<test> .

を試したところ keyof typeof test を返します。 never という説明もできませんでした。

その他の回答 このように 指す extends しかし、その仕組みがよくわからないし、型として set-of-all-params にアクセスする簡単な方法もない。

どのように解決するのですか?

Typescriptには、現在 定義済み Parameters<F> という型のエイリアスが標準ライブラリにあります。 とほぼ同じである。 ArgumentTypes<> のように、独自のタイプエイリアスを作成する代わりに、それを使用すればよいのです。

type TestParams = Parameters<(a: string, b: number) => void> // [string, number]

そして、例えば2番目のパラメータの型を取得するには、数値インデキシング演算子を使用することができます。

type SecondParam = TestParams[1] // number

オリジナルの回答です。


はい、TypeScript 3.0で導入されたのは レスト/スプレッド位置のタプル というように、条件付き型を作成することができます。

type ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;

うまくいくかどうか見てみましょう。

type TestArguments = ArgumentTypes<typeof test>; // [string, number]

良さそうですね。 この強化されたタプルは、オプションのパラメータやレストパラメータといったものも捕らえることができることに注意してください。

declare function optionalParams(a: string, b?: number, c?: boolean): void;
type OptionalParamsArgs = ArgumentTypes<typeof optionalParams>; 
// [string, (number | undefined)?, (boolean | undefined)?]

declare function restParams(a: string, b: number, ...c: boolean[]): void;
type RestParamsArgs = ArgumentTypes<typeof restParams>;
// [string, number, ...boolean[]]

お役に立てれば幸いです。 幸運を祈ります。