首页 > 解决方案 > 打字稿中有没有办法确保传递给更高阶的函数具有特定的返回类型?

问题描述

一个函数需要另一个通用函数作为输入,它被定义为:

function higherOrderFunction(fn: Function): Function<void> {
  return (...args: any[]) => fn(...args);
} 

称为

function fun(x: number, y: string) { console.log(`${x}${+y}`); }

const higherOrderFunctionWithFunction = higherOrderFunction(fun);
higherOrderFunctionWithFunction(1, '3')

这抛出

ts(2315):函数不是泛型的

这是有道理的。因此,我如何强制返回的函数higherOrderFunction具有特定的返回类型(无论是void其他类型)?(无论我们是否在fun“低阶”函数中指定返回类型)

我知道打字稿具有ReturnType实用功能。但是,在这种情况下如何使用它?

标签: typescript

解决方案


您可以higherOrderFunction使用类型为参数函数的返回类型的泛型。

一般来说,一个函数会像(...args: any[]) => TT是返回类型。

首先,为函数类型创建一个别名类型,然后使用该类型作为参数和返回类型higherOrderFunction

type FunctionType<T> = (...args: any[]) => T;

function higherOrderFunction<T>(fn: FunctionType<T>): FunctionType<T> {
  return (...args: any[]) => fn(...args);
}

用法,

function fun(x: number, y: string) {
  console.log(`${x}${+y}`);
}

const higherOrderFunctionWithFunction = higherOrderFunction(fun);
const result = higherOrderFunctionWithFunction(1, '3'); // return "void"
function fun(x: number, y: string) {
  return `${x}${+y}`;
}

const higherOrderFunctionWithFunction = higherOrderFunction(fun);
const result = higherOrderFunctionWithFunction(1, '3'); // return string

推荐阅读