Я понимаю, что этот пост старый, но есть более компактный подход, который немного отличается от того, что было задано, но может быть очень полезной альтернативой. Вы можете по существу объявить функцию в строке при вызове метода (Foo
's save()
в этом случае). Он будет выглядеть примерно так:
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()
очень полезен для таких вещей, как сетевые вызовы, которые могут преуспеть или сбой. Опять же, предполагая пример сетевого вызова, когда вызывается multipleCallbacks()
, поведение как для успеха, так и для отказа может быть определено в одном месте, что дает большую ясность для будущих читателей кода.
Как правило, в моем опыт, этот подход позволяет себе быть более кратким, менее беспорядочным и большей ясностью в целом.
Удачи всем!