web-dev-qa-db-ja.com

Typescript戻り値ジェネリック関数のタイプ

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

ジェネリック関数が特定の型パラメーターを指定する戻り型を抽出する方法はありますか?

23
samfrances

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
12
artem