Vyhledávání na webu

typescript - Získání návratového typu funkce


Mám následující funkci:

function test(): number {
    return 42;
}

Typ funkce mohu získat použitím typeof:

type t = typeof test;

Zde bude t () => number.

Existuje způsob, jak získat návratový typ funkce? Chtěl bych, aby t bylo number místo () => number.

Odpověď č. 1

UPRAVIT

Od verze TypeScript 2.8 je to oficiálně možné s ReturnType<T>.

type T10 = ReturnType<() => string>;  // string
type T11 = ReturnType<(s: string) => void>;  // void
type T12 = ReturnType<(<T>() => T)>;  // {}
type T13 = ReturnType<(<T extends U, U extends number[]>() => T)>;  // number[]

Podívejte se na tento pull request do Microsoft/TypeScript pro podrobnosti.

TypeScript je úžasný!


Staromódní hack

Ryanova odpověď bohužel už nefunguje. Ale upravil jsem ji pomocí hacku, z čehož jsem absurdně šťastný. Hle:

const fnReturnType = (false as true) && fn();

Funguje to tak, že false je převedeno na literální hodnotu true, takže typový systém si myslí, že návratová hodnota má typ funkce, ale když kód skutečně spustíte, přeruší se to na false.

Odpověď č. 2

Nejjednodušší způsob v TypeScript 2.8:

const foo = (): FooReturnType => {
}

type returnType = ReturnType<typeof foo>;
// returnType = FooReturnType

Odpověď č. 3

Použijte vestavěný ReturnType:

type SomeType = ReturnType<typeof SomeFunc>

ReturnType se rozšiřuje na:

type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : any;

Související články