我有一个像下面这样的方法。
public check(uid, callBack: (msg: string, state: boolean) => void) {
//some other code
}
我想确保无论是谁调用check
,还要声明下面的类型。
check('uid here', (msg:string, state:boolean)=>{
/good
});
但是以下情况也可以解决问题。
check('uid here', (msg:string)=>{
// bad
});
无论如何要强制执行回调的所有参数?
答案 0 :(得分:4)
关于仅包含字符串参数的示例:它是一个完全有效的回调,如果您不在回调中使用它,则不必列出参数。你可以避免使用未使用的函数参数。即使以下内容也是有效的:
check('uid here', () => {
// your callback
})
如果参数不同,您将遇到问题,因此在以下示例中您将收到错误:
check('uid here', (somethingReallyBad: object) => {
// Types of parameters 'something' and 'msg' are incompatible.
// Type 'string' is not assignable to type 'object'.
})
答案 1 :(得分:2)
不,据我所知,没有办法强制执行回调来定义所有参数。这实际上很好 - 跳过你不会在你的回调中使用的参数是相当安全的。
TS检查回调参数的类型,如果回调声明它们并在其正文中使用。例如。如其他答案所述:
// incompatible type, error!
check('uid here', (wrongType: number) => {
});
我没有看到强迫回调开发者列出所有参数的意义,即使他们不关心它们。
// I want just print some output, why should I type 10+ chars of code
// declaring unused args
check(uid, (msg: string, state: boolean) => {
console.log('OK');
})
//instead of writing
check(uid, () => console.log('OK'));
答案 2 :(得分:1)
我对此感到困惑,似乎只有在你调用回调时强制执行该类型:
type StateCallback = (msg: string, state: boolean) => void
function checkTwo(uid: string, callBack: StateCallback) : void {
// this is not allowed!
callBack()
// you have to use the params of StateCallback
callBack("hi!", true)
}
let cb: StateCallback = () => { console.log("hi") }
checkTwo("boink", cb)
如果没有cb
和string
参数,您可以定义boolean
,这有点奇怪。
当你致电cb()
时,它仍然需要这些参数!
如果您想在回调中实际使用msg
和state
,则必须对其进行定义:
let cb2: StateCallback = (msg:string) => { console.log(msg) }
checkTwo("boink", cb2)
let cb3: StateCallback = (msg: string, state:boolean) => { console.log(msg, state) }
checkTwo("boink", cb3)