Typescript中是否有办法确保传递给更高阶的函数具有特定的返回类型?

时间:2020-08-13 23:29:53

标签: typescript

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

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实用程序功能。但是,在这种情况下如何使用呢?

1 个答案:

答案 0 :(得分:0)

您可以使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