2017-08-28 52 views
1

我想定义一个函数,它将回调作为参数,并且应该要求回调的参数。 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"); 
}); 

回答

1

没有办法做到这一点。

回调具有比主叫用户提供较少的参数是极为共同在JavaScript - 功能,如forEachmapfilter等所有提供3个或多个参数而被频繁给出1-参数用作回调。

+1

对,但我认为Typescript将提供一种方法来定义具有所需参数的回调。类似'function doThing(callback:(num !: number)...')将会很酷,与'?'可选参数标识符相反。 – Jazcash

+3

但是如果你不添加回调参数想要在回调的主体中使用该参数吗? – Stephan

0

您可以为处理程序定义一个类型。现在您只能传递一个具有字符串参数的回调。

// 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) 
+0

这并不能解决OP所要求的问题。用你显示的代码可能会有'thisFirst((=)=> console.log(“foo”));'编译没有错误,OP希望代码给出一个错误,因为回调函数没有定义参数 – Louis

+0

好的,我的解决方案不是使用匿名回调,而是定义一个类型和函数名。在我看来,结果是更清晰,更易读的代码,但我意识到这只是我的看法:-) – Kokodoko

+0

匿名或不是在这里的问题不是一个因素。拿你在回答中显示的代码,并像这样定义'doSomething':'function doSomething():void {'。从'doSomething'中删除对't'的引用。您仍然可以执行'thisFirst(doSomething)'而不会在该调用中发生编译错误。 – Louis