我在TypeScript中有以下类:
class CallbackTest
{
public myCallback;
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
我正在使用这样的课程:
var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();
代码有效,因此它会按预期显示消息框。
我的问题是:我的课程字段myCallback
是否有任何类型?目前,公开字段myCallback
的类型为any
,如上所示。如何定义回调的方法签名?或者我可以将类型设置为某种回调类型?或者我可以做些什么吗?我是否必须使用any
(隐式/显式)?
我尝试过类似的东西,但它不起作用(编译时错误):
public myCallback: ();
// or:
public myCallback: function;
我在网上找不到任何解释,所以我希望你能帮助我。
答案 0 :(得分:169)
我刚刚在TypeScript语言规范中找到了一些东西,它相当容易。我非常接近。
语法如下:
public myCallback: (name: type) => returntype;
在我的例子中,它将是
class CallbackTest
{
public myCallback: () => void;
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
答案 1 :(得分:124)
更进一步,您可以声明一个指向函数签名的类型指针,如:
interface myCallbackType { (myArgument: string): void }
并像这样使用它:
public myCallback : myCallbackType;
答案 2 :(得分:46)
您可以声明一个新类型:
declare type MyHandler = (myArgument: string) => void;
var handler: MyHandler;
不需要declare
关键字。它应该在.d.ts文件或类似情况下使用。
答案 3 :(得分:27)
这是一个例子 - 不接受任何参数并且不返回任何参数。
class CallbackTest
{
public myCallback: {(): void;};
public doWork(): void
{
//doing some work...
this.myCallback(); //calling callback
}
}
var test = new CallbackTest();
test.myCallback = () => alert("done");
test.doWork();
如果您想接受参数,也可以添加参数:
public myCallback: {(msg: string): void;};
如果你想返回一个值,你也可以添加它:
public myCallback: {(msg: string): number;};
答案 4 :(得分:6)
如果您想要通用功能,可以使用以下功能。虽然它似乎没有在任何地方记录。
class CallbackTest {
myCallback: Function;
}
答案 5 :(得分:4)
我来晚了一点,但是,自从一段时间以前在TypeScript中以来,您可以使用
定义回调的类型。type MyCallback = (KeyboardEvent) => void;
使用示例:
this.addEvent(document, "keydown", (e) => {
if (e.keyCode === 1) {
e.preventDefault();
}
});
addEvent(element, eventName, callback: MyCallback) {
element.addEventListener(eventName, callback, false);
}
答案 6 :(得分:1)
我在尝试将回调添加到事件侦听器时遇到了同样的错误。奇怪的是,将回调类型设置为EventListener解决了它。它看起来比将整个函数签名定义为类型更优雅,但我不确定这是否是正确的方法。
class driving {
// the answer from this post - this works
// private callback: () => void;
// this also works!
private callback:EventListener;
constructor(){
this.callback = () => this.startJump();
window.addEventListener("keydown", this.callback);
}
startJump():void {
console.log("jump!");
window.removeEventListener("keydown", this.callback);
}
}
答案 7 :(得分:1)
这是我如何定义包含回调的接口的简单示例。
// interface containing the callback
interface AmazingInput {
name: string
callback: (string) => void //defining the callback
}
// method being called
public saySomethingAmazing(data:AmazingInput) {
setTimeout (() => {
data.callback(data.name + ' this is Amazing!');
}, 1000)
}
// create a parameter, based on the interface
let input:AmazingInput = {
name: 'Joe Soap'
callback: (message) => {
console.log ('amazing message is:' + message);
}
}
// call the method, pass in the parameter
saySomethingAmazing(input);
答案 8 :(得分:0)
您可以使用以下内容:
type
关键字,为函数文字加上别名)以下是如何使用它们的示例:
type myCallbackType = (arg1: string, arg2: boolean) => number;
interface myCallbackInterface { (arg1: string, arg2: boolean): number };
class CallbackTest
{
// ...
public myCallback2: myCallbackType;
public myCallback3: myCallbackInterface;
public myCallback1: (arg1: string, arg2: boolean) => number;
// ...
}
答案 9 :(得分:-1)
这是Angular组件和服务的可选回调函数示例
maincomponent(){
const param = "xyz";
this.service.mainServie(param, (response)=>{
if(response){console.log("true");}
else{console.log("false");}
})
}
//Service Component
mainService(param: string, callback?){
if(string === "xyz"){
//call restApi
callback(true);
}
else{
callback(false);
}
}