在Typescript中将泛型函数作为回调传入

blpfk2vs  于 2023-03-24  发布在  TypeScript
关注(0)|答案(4)|浏览(144)

我试图保留回调的参数的类型信息,其中回调是泛型:

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

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

let x = Bar( Foo<String> )

这看起来不像有效的类型脚本语法。有什么方法可以做到这一点吗?

l7mqbcuq

l7mqbcuq1#

扩展罗德里戈的答案在这里。如果你有一个通用的函数:

function doSomething<T>(t: T): void {
    console.log("oh " + t);
}

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

type Handler = <T>(t: T) => void;

然后你可以使用类型Handler作为函数参数:

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

thisFirst(doSomething)
gmxoilav

gmxoilav2#

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

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

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

let x = Bar(Foo);
bmp9r5qi

bmp9r5qi3#

你可以用一个泛型参数为callback定义一个泛型函数,如下所示:

const handleSomething =
  <T extends (...args: Parameters<T>) => ReturnType<T>>(callback: T) =>
  (...args: Parameters<T>) =>
    callback(...args)
ruarlubt

ruarlubt4#

如果在代码中定义了带有回调参数的函数,其他答案也很有用。下面是更通用的解决方案,它总是有效的:

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

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

let x = Bar( (argument: String) => Foo<String>(argument) ) // using arrow functions
let x1 = Bar(function(argument: String) {
   return Foo<String>(argument)
}

在上面的代码中,我们创建了一个新的匿名函数,该函数具有与回调函数相同的参数,调用指定类型的函数Foo,并返回Foo将返回的任何值。

相关问题