在TypeScript中输入函数作为可能的参数?
在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);
保存回调不是类型安全的,我给它一个回调函数,其中函数的参数是一个字符串,但我传递给它一个数字,并编译时没有错误。 我可以使结果参数保存为类型安全函数吗?
tl; dr版本:在TypeScript中是否有等价的.NET委托?
当然:
class Foo {
save(callback: (n: number) => any) : void {
callback(42);
}
}
var foo = new Foo();
var strCallback = (result: string) : void => {
alert(result);
}
var numCallback = (result: number) : void => {
alert(result.toString());
}
foo.save(strCallback); // not OK
foo.save(numCallback); // OK
如果你愿意,你可以定义一个类型来封装这个:
type NumberCallback = (n: number) => any;
class Foo {
// Equivalent
save(callback: NumberCallback) : void {
callback(42);
}
}
下面是一些常见的.NET委托的TypeScript等价物:
interface Action<T>
{
(item: T): void;
}
interface Func<T,TResult>
{
(item: T): TResult;
}
我意识到这篇文章是旧的,但有一个更紧凑的方法,它与问题稍有不同,但可能是一个非常有用的选择。 当调用方法时,你可以基本上声明这个函数save()
在这种情况下, Foo
的save()
)。 它看起来像这样:
class Foo {
save(callback: (n: number) => any) : void {
callback(42)
}
multipleCallbacks(firstCallback: (s: string) => void, secondCallback: (b: boolean) => boolean): void {
firstCallback("hello world")
let result: boolean = secondCallback(true)
console.log("Resulting boolean: " + result)
}
}
var foo = new Foo()
// Single callback example.
// Just like with @RyanCavanaugh's approach, ensure the parameter(s) and return
// types match the declared types above in the `save()` method definition.
foo.save((newNumber: number) => {
console.log("Some number: " + newNumber)
// This is optional, since "any" is the declared return type.
return newNumber
})
// Multiple callbacks example.
// Each call is on a separate line for clarity.
// Note that `firstCallback()` has a void return type, while the second is boolean.
foo.multipleCallbacks(
(s: string) => {
console.log("Some string: " + s)
},
(b: boolean) => {
console.log("Some boolean: " + b)
let result = b && false
return result
}
)
multipleCallback()
方法对于可能成功或失败的网络调用是非常有用的。 再次假设一个网络调用示例,当调用multipleCallbacks()
时,成功和失败的行为都可以在一个点上定义,这为将来的代码读取器提供了更高的清晰度。
一般来说,根据我的经验,这种方法可以使得整体更简洁,更简洁,更清晰。
祝你好运!
链接地址: http://www.djcxy.com/p/43151.html上一篇: typed functions as parameters possible in TypeScript?
下一篇: Inferring generic types of nested static generic functions