我在 TypeScript 中有以下类:
class Log
{
public id: number;
public text: string;
construct(text: string){
this.text = text;
}
save(){
db.run(
`insert into logs(text) values (?) `,
this.text,
((this: RunResult, err: Error | null) => {
if(err){
//...
}
console.log(this);//expecting RunResult{} but Log{}
})
)
}
}
我想通过在回调函数块中使用
RunResult.lastID
来更新日志实例的 id,并且 @types/sqlite3/index.d.ts
包含此声明:
run(params: any, callback?: (this: RunResult, err: Error | null) => void): this;
但是回调参数中的
this
是Log类型而不是RunResult类型。
如何获得正确的 RunResult 实例?
this.lastID
期待一个值而不是undefined
this
函数参数中的run
关键字不是要传递的参数,而是函数上下文。此外,箭头函数没有上下文,因此回调中的 this
关键字确实引用了 Log
类。
因此,首先,您必须在回调之外保留
Log
类上下文,并使用普通函数而不是箭头函数作为回调。
这是修改后的
save
功能:
save() {
const instance = this;
db.run(
`insert into lorem(info) values (?) `,
this.text,
function (err: Error | null) {
if (err) {
console.log(err);
}
instance.id = this.lastID;
console.log(this);
}
);
}