打字稿:如何正确使用回调

时间:2018-04-12 08:27:37

标签: typescript

我有一个像下面这样的方法。

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

无论如何要强制执行回调的所有参数?

3 个答案:

答案 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)

如果没有cbstring参数,您可以定义boolean,这有点奇怪。 当你致电cb()时,它仍然需要这些参数!

如果您想在回调中实际使用msgstate,则必须对其进行定义:

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)