TypeScript 2.8 の新しいReturnType
は、特定の関数の戻り値の型を抽出できる非常に便利な機能です。
function foo(e: number): number {
return e;
}
type fooReturn = ReturnType<typeof foo>; // number
ただし、ジェネリック関数のコンテキストで使用するのに問題があります。
function foo<T>(e: T): T {
return e;
}
type fooReturn = ReturnType<typeof foo>; // type fooReturn = {}
type fooReturn = ReturnType<typeof foo<number>>; // syntax error
type fooReturn = ReturnType<(typeof foo)<number>>; // syntax error
ジェネリック関数が特定の型パラメーターを指定する戻り型を抽出する方法はありますか?
TypeScriptコンパイラは、typeof foo
をジェネリック型として認識しません。コンパイラのバグだと思います。
ただし、TypeScriptには callable interfaces があり、問題なく汎用的に使用できるため、関数のシグネチャと互換性のある呼び出し可能なインターフェイスを導入すると、ReturnType
のような独自の同等の機能を実装できますこの:
function foo<T>(x: T): T {
return x;
}
interface Callable<R> {
(...args: any[]): R;
}
type GenericReturnType<R, X> = X extends Callable<R> ? R : never;
type N = GenericReturnType<number, typeof foo>; // number