在TypeScript中可以使用强types函数作为参数吗?

在TypeScript中,我可以将一个函数的参数声明为一个Functiontypes。 有没有一个“types安全”的做法,我失踪了? 例如,考虑一下:

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); 

保存callback不是types安全的,我给它一个callback函数,其中函数的参数是一个string,但我传递给它一个数字,编译没有错误。 我可以使结果参数保存types安全的function吗?

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 

如果你愿意,你可以定义一个types来封装这个:

 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; } 

我意识到这个post是旧的,但有一个更紧凑的方法,是比要求稍有不同,但可能是一个非常有用的select。 当调用方法时,你可以基本上声明这个函数save()在这种情况下, Foosave() )。 它看起来像这样:

 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()方法对于可能成功或失败的networking调用是非常有用的。 再次假设一个networking调用的例子,当调用multipleCallbacks()时,成功和失败的行为都可以定义在一个地方,这为将来的代码读者提供了更高的清晰度。

一般来说,根据我的经验,这种方法更简洁,更简洁,总体上更清晰。

祝你好运!

 type FunctionName = (n: returnType) => any; class ClassName { save(callback: FunctionName) : void { callback(data); } } 

这肯定与函数式编程范例一致。