在TypeScript中,我可以将函数的参数声明为Function类型。是否有我所缺少的“类型安全”的方法来实现这一点?例如,考虑以下情况:
class Foo {
save(callback: Function) : void {
//Do the save
var result : number = 42; //We get a number from the save operation
//Can I at compile-time ensure the callback accepts a single parameter of type number somehow?
callback(result);
}
}
var foo = new Foo();
var callback = (result: string) : void => {
alert(result);
}
foo.save(callback);
保存回调函数不是类型安全的,我给它一个回调函数,其中函数的参数是一个字符串,但我传递给它一个数字,并且编译时没有错误。我可以让save中的result参数成为类型安全的函数吗?
TL;DR版本:在TypeScript中是否存在.NET委托等效项?
9条答案
按热度按时间pengsaosao1#
当然,一个函数的类型由它的参数类型和返回类型组成,这里我们指定
callback
参数的类型必须是“接受数字并返回any
类型的函数“:如果需要,您可以定义型别别名来封装这个:
2w3kk1z52#
下面是一些常见.NET委托的TypeScript等效项:
zbsbpyhn3#
这当然与函数式编程范式一致。
zhte4eai4#
我知道这篇文章很老了,但是有一种更简洁的方法,它与所要求的方法略有不同,但可能是一种非常有用的替代方法。在调用方法时,你可以直接声明函数(在本例中是
Foo
的save()
)。它看起来像这样:multipleCallback()
方法对于可能成功或失败的网络调用非常有用。再次假设一个网络调用示例,当调用multipleCallbacks()
时,成功和失败的行为都可以在一个位置定义,这有助于将来的代码读者更清楚地理解。一般来说,根据我的经验,这种方法有助于更简洁,更少混乱,整体上更清晰。
祝大家好运!
mzmfm0qo5#
在TS中,我们可以按以下方式在中键入函数:
函数类型/签名
这用于函数/方法的真实的实现,其语法如下:
范例:
函数类型文字
函数类型文字是声明函数类型的另一种方式。它们通常应用于高阶函数的函数签名中。高阶函数是接受函数作为参数或返回函数的函数。它具有以下语法:
范例:
jexiocij6#
如果首先定义函数类型,则它看起来像
如果没有使用普通属性语法的函数类型,它将是:
如果你想通过使用像C#这样的接口函数进行泛型委托的话,那就应该是:
5lhxktic7#
因为你不能很容易地联合一个函数定义和另一个数据类型,所以我发现有这些类型对于强类型化它们很有用。
现在你可以强类型化每个参数和返回类型了!这里有一个例子,比上面的例子有更多的参数。
现在,您可以编写联合类型,如对象或返回对象的函数,而无需创建可能需要导出或使用的全新类型。
qgelzfjb8#
除了其他人所说的,一个常见的问题是声明同一个重载函数的类型。典型的例子是EventEmitter on()方法,它将接受多种类型的侦听器。类似的情况也可能发生在使用redux操作时--在那里你使用操作类型作为文字来标记重载。在EventEmitters的情况下,你使用事件名称文字类型:
elcex8rz9#