Typescript:必需的回调参数?
我想定义一个函数,它将回调作为参数,并且应该要求回调的参数。 Typescript正确地报告具有不匹配的参数类型的回调,但没有提及没有预期参数的回调。Typescript:必需的回调参数?
为什么第二个on
调用不是错误,并且有什么办法可以让它出错?
function on(callback: (num: number) => void) {
callback(5);
}
on((string:bob) => { // typescript error
console.log("What");
});
on(() => { // no typescript error?
console.log("What");
});
没有办法做到这一点。
回调具有比主叫用户提供较少的参数是极为共同在JavaScript - 功能,如forEach
,map
,filter
等所有提供3个或多个参数而被频繁给出1-参数用作回调。
您可以为处理程序定义一个类型。现在您只能传递一个具有字符串参数的回调。
// define a handler so you can use it for callbacks
type Handler = (t: string) => void;
function doSomething(t: string): void {
console.log("hello " + t)
}
function thisFirst(callback: Handler) {
callback('world') // ok
callback(4) // not assignable to type 'string'
}
thisFirst(doSomething)
这并不能解决OP所要求的问题。用你显示的代码可能会有'thisFirst((=)=> console.log(“foo”));'编译没有错误,OP希望代码给出一个错误,因为回调函数没有定义参数 – Louis
好的,我的解决方案不是使用匿名回调,而是定义一个类型和函数名。在我看来,结果是更清晰,更易读的代码,但我意识到这只是我的看法:-) – Kokodoko
匿名或不是在这里的问题不是一个因素。拿你在回答中显示的代码,并像这样定义'doSomething':'function doSomething():void {'。从'doSomething'中删除对't'的引用。您仍然可以执行'thisFirst(doSomething)'而不会在该调用中发生编译错误。 – Louis
对,但我认为Typescript将提供一种方法来定义具有所需参数的回调。类似'function doThing(callback:(num !: number)...')将会很酷,与'?'可选参数标识符相反。 – Jazcash
但是如果你不添加回调参数想要在回调的主体中使用该参数吗? – Stephan