在Typescript中将通用函数作为回调传递

One*_*ude 7 typescript

我正在尝试保留回调参数的类型信息,其中回调是通用的:

function Foo<Template>(argument: Template) {
  // Do something with argument
}

function Bar(callback: Function) {
  callback('something')
}

let x = Bar( Foo<String> )
Run Code Online (Sandbox Code Playgroud)

这看起来不像有效的打字稿语法。有什么办法吗?

Kok*_*oko 9

在这里扩展罗德里戈的答案。如果您有一个具有泛型的函数:

function doSomething<T>(t: T): void {
    console.log("oh " + t);
}
Run Code Online (Sandbox Code Playgroud)

您可以按如下方式定义函数的类型:

type Handler = <T>(t: T) => void;
Run Code Online (Sandbox Code Playgroud)

然后您可以将该类型Handler用作函数参数:

function thisFirst(callback: Handler) {
  callback<string>('boink');
}

thisFirst(doSomething)
Run Code Online (Sandbox Code Playgroud)


Anr*_*yen 6

您可以使用通用参数定义回调的通用函数,如下所示:

const handleSomething =
  <T extends (...args: Parameters<T>) => ReturnType<T>>(callback: T) =>
  (...args: Parameters<T>) =>
    callback(...args)
   
Run Code Online (Sandbox Code Playgroud)


Rod*_*ris 2

Function是任意函数。尝试指定回调。

function Foo<Template>(argument: Template) {
  // Do something with argument
}

function Bar(callback: { (argument: string) }) {
  callback('something')
}

let x = Bar(Foo);
Run Code Online (Sandbox Code Playgroud)