TypeScriptで引数と戻り値の型を指定できる関数の型を定義する

関数そのものの型は、たとえば以下のように定義できますが、この引数の型や引数の数、戻り値の型を任意の型に変更できるような型を定義したくなりました。

type FuncType = (a: number, b: string) => boolean

ジェネリクス型をうまく使うとできそうですが、最終的に以下のようにできました。

type FuncType<T extends Array<unknown>, U> = (...vars: T) => U

引数の型を示すジェネリクス型Tは配列の型を受け取り、関数の引数の部分に使います。この引数は残余引数構文を使うことで、T型の配列型を引数として展開できます。

たとえば、

type Func = FuncType<[number, number], boolean>

と書くと、type Func = (vars_0: number, vars_1: number) => boolean と評価されるので、以下の記述は型チェックをパスしますが

const funcTypeMatched: Func = (a: number, b: number) => {return a === b}

以下の記述は引数の型が Func 型と異なるので型チェックをパスしません。

const funcTypeMismatched: Func = (a: number, b: string) => {return a.toString() === b}

TypeScript Playgroundでもこの挙動を確認できます。

以上小ネタでした。ではでは。

このカウンタは @piyoppi/counter-tools を使っています。

クリックすると匿名でいいねできます。